从日期开始获取一年中的周数

Fre*_*kyB 5 t-sql sql-server

我正在寻找一个查询,它将返回给定日期的周数.

我已经尝试过的是:

select datepart(wk, '2017-02-01')
Run Code Online (Sandbox Code Playgroud)

但这会返回5而不是6.(2月1日是一年的第6周).

(周数用红色)

在此输入图像描述

Sql*_*Zim 14

您可能需要指定一周的第一天set datefirst:

set datefirst 1;
select datepart(week, '2017-02-01');
Run Code Online (Sandbox Code Playgroud)

回报 6


根据默认语言,您datefirst可能设置为7.

set datefirst 7;
select datepart(week, '2017-02-01');
Run Code Online (Sandbox Code Playgroud)

回报 5

rextester演示:http://rextester.com/KEPB52852

  • 任何人都想知道什么是 [`set datefirst`](https://docs.microsoft.com/en-us/sql/t-sql/statements/set-datefirst-transact-sql?view=sql-server-ver15 ) (2认同)
  • `WEEK` 日期部分与上一年重叠(上一年的最后一周是下一年的第一周),为了避免这个问题,最好使用 [ISO_WEEK](https://stackoverflow.com/ a/63884844/1657465)答案 (2认同)

小智 9

您还可以考虑在“datepart”中使用“iso_week”而不是“week”参数。在这种情况下,您可以避免使用“set datefirst 1”,如果您只能使用一个选择,这会很方便。

有关“iso_week”的更多详细信息:“ISO 8601 包括 ISO 周日期系统,这是一个周编号系统。每周都与发生星期四的年份相关联”

你可以这样比较两者:

SELECT datepart(ISO_WEEK, '2020.01.01') -- Wed
SELECT datepart(WEEK, '2020.01.01') -- Wed
SELECT datepart(ISO_WEEK, '2020.01.05') -- Sun
SELECT datepart(WEEK, '2020.01.05') -- Sun
SELECT datepart(ISO_WEEK, '2020.01.06') -- Mon
SELECT datepart(WEEK, '2020.01.06') -- Mon
Run Code Online (Sandbox Code Playgroud)

请注意 2020 年 1 月 5 日星期日的差异:

-----------
1
1
1
2
2
2
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以使用以下命令从包含日期的特定列中获取周数:

DATEPART(WK, orders.createddate) AS Week, 
Run Code Online (Sandbox Code Playgroud)

这取自下面可用的 DATEPART 函数:

   DATEPART(YY, orders.createddate) AS Year, 
   DATEPART(QQ, orders.createddate) AS Quarter, 
   DATEPART(WK, orders.createddate) AS Week, 
   DATEPART(DY, orders.createddate) AS dayofYear, 
   DATEPART(MM, orders.createddate) AS Month, 
   DATEPART(DD, orders.createddate) AS Date, 
   DATEPART(hour, orders.createddate) AS Hour, 
   DATEPART(minute, orders.createddate) AS Minute, 
   DATEPART(second, orders.createddate) AS Second, 
   DATEPART(millisecond, orders.createddate) AS Millsecond, 
   DATEPART(microsecond, orders.createddate) AS Microsecond, 
   DATEPART(nanosecond, orders.createddate) AS Nanosecond,
Run Code Online (Sandbox Code Playgroud)