日期:2014-05-17  浏览次数:20503 次

SQL Server DatePart 如何设置一年的第一周
语句是select DatePart(ww,getdate())
默认一年第一周是1月1日所在周,我想取第一个FullWeek为第一周,该怎么设置?
网上查到DatePart(interval, date[,firstdayofweek[, firstweekofyear]]) 
但是一直报错用不了。
求助啊!%>_<%
------最佳解决方案--------------------
declare @d datetime = '2013-01-06'
select datepart(ww, @d) - sign(datepart(dw,datename(year,@d))-1)

------其他解决方案--------------------

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。



------其他解决方案--------------------
31#怎么应用于列级,24#就怎样应用于列级,公式替换,中间变量和中间结果代入,数学作业做过不少的啦。
------其他解决方案--------------------
什么意思 没搞懂。。。
------其他解决方案--------------------
引用:
什么意思 没搞懂。。。


举例子就是
select DatePart(ww,'2013-1-6')
这句执行的结果是2,我想得到1。
------其他解决方案--------------------
select DatePart(ww,'2013-1-6')-1
这样?
------其他解决方案--------------------
引用:
select DatePart(ww,'2013-1-6')-1
这样?


那如果是2012年呢?
每一年的起始周不一样。
我想设置成每年第一个周都是整周。
不知道我有没有表达清楚。

select DatePart(ww,'2013-1-1')得到的结果是1,但是在我的观念里他应该是53(属于去年最后一周)。
------其他解决方案--------------------
明白了 你是想按自然日 取周? 1-7为第一周 8-14为2周
------其他解决方案--------------------
引用:
明白了 你是想按自然日 取周? 1-7为第一周 8-14为2周


我觉得你应该是明白了,有办法吗?
http://baike.baidu.com/view/327452.htm
这里面给的语法不能用啊。
------其他解决方案--------------------
select ceiling(cast(DateName (Dy,'2013-1-21') as INT)/7.0)
------其他解决方案--------------------