为什么SQL在2011年1月1日返回第1周?

时间:2012-04-20 23:40:03

标签: sql-server sql-server-2005

我将DateFirst设置为7.现在,当我运行以下SQL时,它返回第1周:

SET DateFirst 7
SELECT DATEPART(wk, '1/1/2011') as WeekNumber

我不知道为什么这会在第1周返回,如果我的开始日设置为7.据我说,第1周应该从2011年1月1日开始,这是一个星期天。我怎么能纠正这个?

2 个答案:

答案 0 :(得分:3)

来自http://msdn.microsoft.com/en-us/library/ms174420%28v=sql.90%29.aspx

  

星期(wk,ww)datepart反映了对SET DATEFIRST所做的更改。   任何一年的1月1日定义了本周的起始编号   datepart,例如:DATEPART(wk,'Jan 1,xxxx')= 1,其中xxxx是   任何一年。

所以:因为它被定义为这样。

编辑:您可以在SQL-SERVER中修复此问题。使用这样的东西:

DATEPART(wk, 
  DATEADD(day, 
    -( (DATEPART(day, date) + 8 - DATEPART(weekday, date)) % 7 - 1),
    date
  )
)

这段代码的作用是使用当年的当天和工作日来计算哪一天是一年中的第一个星期日,然后从当前日期减去那一天,给出一个开始年份的虚拟日期在星期日,然后取该日期的星期数,根据您的定义,它应等于星期数。

答案 1 :(得分:2)

还有ISO周

第01周有相互等同的定义:

  • 本周第一个星期四的一周,
  • 1月4日的一周,
  • 第一周,在开始年份的大部分时间(四次或更多次)和
  • 从12月29日至1月4日的星期一开始的一周。

如果1月1日是星期一,星期二,星期三或星期四,则是01周。如果1月1日是星期五,星期六或星期日,则是上一年的第52周或第53周。

http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/iso-week-in-sql-server