0

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

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

如果我的开始日设置为 7,我不确定为什么这会返回第 1 周。根据我的说法,第 1 周应该从 2011 年 1 月 2 日开始,即星期日。我该如何纠正?

4

2 回答 2

3

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

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

所以:因为它是这样定义的。

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

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

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

于 2012-04-20T23:42:35.743 回答
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

于 2012-04-20T23:45:31.567 回答