博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sql 语句小课堂5:日期的计算及应用
阅读量:4162 次
发布时间:2019-05-26

本文共 1459 字,大约阅读时间需要 4 分钟。

需求1,按周统计每周注册的用户数量

;with t as (	select min(u_reg) as 最早注册时间,datepart(w,min(u_reg)) as 周几 	from pub_users with (nolock) 	where u_reg>'2000-1-1'),t1 as (	select *		,dateadd(d,(case when 周几=1 then -6 else 2-周几 end),convert(date,最早注册时间)) as 周一 	from t),t2 as (	select datediff(d,周一,u_reg)/7+1 as 周目,count(0) as 注册量 	from pub_users u with (nolock),t1 b 	where u_reg>=周一	group by datediff(d,周一,u_reg)/7)select t2.*,dateadd(d,(周目-1)*7,周一),dateadd(d,周目*7-1,周一) from t2,t1 order by 1

为了符合国内的习惯,周一为每周第一天,所以要计算出周一的日期来,然后根据日期与第一个周日的日期差比7之后的数字就得到周目,按照周目统计即可得到每周统计数,最后输出时,将当前周目的周一和周日日期列出

需求2,对于注册用户,自注册日起,每个自然月发布的产品进行统计,注,自然月第一天从注册日计算,即:3月9日注册的,3月9日至4月8日为第一个自然月

;with t as (	select * from users a	cross apply(		select number		from master..spt_values		where type='p' and number<=datediff(m,a.reg_date,getdate())	) b	cross apply(		select dateadd(m,number,reg_date) as month_start		,dateadd(d,-1,dateadd(m,number+1,reg_date)) as month_end		where dateadd(m,number,reg_date)<=getdate()	) c)select uid,month_start,month_end,cnt from t across apply(	select count(0) as cnt,sum(case when isDel=1 then 1 else 0 end) as 删除数		,sum(case when isDel=0 and isOnline=1 then 1 else 0 end) as 上线数 	from products with (nolock)	where u_id=a.uid and createTime>=month_start and convert(date,createTime)<=month_end) border by a.uid,month_start

自然月的计算还是用dateadd方式吧,年也一样,否则闰年,大月、小月能弄死人的,dateadd(m,1,'2019-1-30')直接得到的数据是2019-2-28,很方便哦,不需要在考虑自然月有几天的问题

直接根据注册时间与当前日期的月份差得出每个月的开始和结束日期,然后直接cross统计数据就可以了

转载地址:http://oxvxi.baihongyu.com/

你可能感兴趣的文章
如何终止线程的运行(C/C++
查看>>
Sqlite数据库及数据库知识点总结
查看>>
在vs2010中编译log4cxx-0.10.0详细方法(从下载、编译、解决错误详细介绍
查看>>
log4cxx多用户的真正解决 配制与代码
查看>>
C++日志系统log4cxx使用总结
查看>>
sqlite3用法详解草稿
查看>>
如何学习Objective-C
查看>>
sqlite表的创建,修改,删除
查看>>
Git远程操作详解
查看>>
培养程序员的人脉
查看>>
技术人,不要总在很初级的层面上谈管理
查看>>
CMarkup与tinyXml直接解析XML字符串
查看>>
技术人员也要注重提升软实力
查看>>
优秀程序员的十个习惯
查看>>
一个老程序员对学弟学妹的一些忠告
查看>>
管理者:我不需要你喜欢我
查看>>
程序员赚钱致富的6种方法
查看>>
世界上的编程语言已这么丰富,为什么还不够?
查看>>
想变富?先学学有钱人的10种思维方式!
查看>>
CListCtrl 和 CListBox的设置选中问题
查看>>