34,870
社区成员




declare @date datetime,@yearFirstDay datetime,@lastYearDay datetime
set @date='2012-1-1' --要计算其周次的日期
set @yearFirstDay=cast(DATEPART(year,@date) as CHAR(4))+'-1-1' --该年的1月1日
set @lastYearDay = cast(DATEPART(year,@date)-1 as CHAR(4))+'-12-31' --去年的12月31日
select
case
when DATEDIFF(WK,@yearFirstDay,@date) = 0 --如果正好是1月1日所在周,用去年最后一周的周次(一般是53)
and DATEPART(DW,@yearFirstDay) > 1 --判断这一年的1月1号是不是周日(1表示周日,2表示周一。。。)
then DATEPART(WK,@lastYearDay+'-12-31')--53
when DATEDIFF(WK,@yearFirstDay,@date) = 0 --如果是1月1号所在周
and DATEPART(DW,@yearFirstDay) = 1 --1月1日正好是周日,则为第一周
then 1 --第一周
when DATEDIFF(WK,@yearFirstDay,@date) > 0 --如果不是1月1号所在周
and DATEPART(DW,@yearFirstDay) = 1 --1月1日正好是周日,则为第一周
then DATEDIFF(WK,@yearFirstDay,@date)+1
else DATEDIFF(WK,@yearFirstDay,@date) --如果是,则1月1号所在周为第一周
end as week --否则,1月1号属于去年最后一周
我写了段实现了我的需求,看起来有点复杂,我相信没多少人看得进去,因为我自己都不愿意看这么复杂的代码的。
之所以没用大家建议的,是因为我不想写存储过程,我写的这个可以直接作为字段用。
写的时候我也觉得这需求太蹩脚了,为什么不能直接用isoweek,但是没办法,之前统计数据库的时候都是用的这个规则,也不能因为我一个人的想法而改变。
我觉得之前之所以会用这一套,是因为在c#里面可以直接指定规则,太方便了,所以没人考虑sql server该怎么办,反正用代码。忽然感觉好悲伤好无力!自己不想绕道用c#写同步程序,结果又不能自如的运用sql server。
所以希望大家以后写程序用什么规则的时候一定要谨慎考虑啊T_T。
declare @d datetime = '2011-01-01', @week int
select @d-=datepart(weekday,@d)-1, @week=datepart(ww,@d)-sign(datepart(dw,datename(year,@d))-1)
select @week