找到当周的开始日(星期一)

时间:2010-10-14 19:33:24

标签: sql-server tsql

查找将确定当前周的开始日(星期一)的SQL查询/查询。

实施例: 如果今天是 - >那么本周的开始是

Sat Oct 09, 2010 -> Start of the week is Monday Oct 04, 2010
Sun Oct 10, 2010 -> Start of the week is Monday Oct 04, 2010
Mon Oct 11, 2010 -> Start of the week is Monday Oct 11, 2010
Tue Oct 12, 2010 -> Start of the week is Monday Oct 11, 2010

我在Google和StackOverflow上看到过很多“解决方案”。看起来像:

SET @pInputDate = CONVERT(VARCHAR(10), @pInputDate, 111)
SELECT DATEADD(DD, 1 - DATEPART(DW, @pInputDate), @pInputDate)

这失败是因为: Sun 2010年10月10日 - > 2010年10月11日星期一开始(不正确)。

5 个答案:

答案 0 :(得分:17)

尝试使用DATEFIRST明确设置星期几被视为“第一个”。

set DATEFIRST 1  --Monday
select DATEADD(DD, 1 - DATEPART(DW, @pInputDate), @pInputDate)

这将返回InputDate所在周的星期一。

答案 1 :(得分:4)

最简单的实现

SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0) MondayOfCurrentWeek

答案 2 :(得分:1)

在p.campbell解决方案的基础上,如果您不想使用或不能使用“ SET DATEFIRST 1”,则可以通过以下操作解决此问题:

SELECT DATEADD(DD, 2 - DATEPART(DW, DATEADD(DD, -1, @pInputDate)), DATEADD(DD, -1, @pInputDate))

答案 3 :(得分:1)

您不需要使用DATEFIRST:

SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0)     -- Monday of current week
SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()) - 1, 0) -- Monday of last week
SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()) + 1, 0) -- Monday of next week

SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0) + 4 -- Friday of current week

答案 4 :(得分:0)

您需要使用DATEFIRST。没有它,您的代码总是将星期日分配给“错误的”星期:

    SELECT DATEADD(wk, DATEDIFF(wk,0,'2020-10-11'), 0) --> Sunday -> 2020-10-12
    SELECT DATEADD(wk, DATEDIFF(wk,0,'2020-10-12'), 0) --> Monday -> 2020-10-12
    SELECT DATEADD(wk, DATEDIFF(wk,0,'2020-10-18'), 0) --> Sunday -> 2020-10-19

在这种情况下,需要注意两个因素:

  1. @@DATEFIRST
  2. 您的星期几开始(对我来说是星期一)

例如:无论@@DATEFIRST的值如何,以下所有行均产生2020-10-12(从星期一开始的一周的星期一,从2020-10-12开始,到2020-10-18的星期日结束):

    SELECT DATEADD(DAY, -((@@DATEFIRST + 7 - (2 - DATEPART(WEEKDAY, '2020-10-12')) % 7) % 7), '2020-10-12')
    SELECT DATEADD(DAY, -((@@DATEFIRST + 7 - (2 - DATEPART(WEEKDAY, '2020-10-13')) % 7) % 7), '2020-10-13')
    SELECT DATEADD(DAY, -((@@DATEFIRST + 7 - (2 - DATEPART(WEEKDAY, '2020-10-14')) % 7) % 7), '2020-10-14')
    SELECT DATEADD(DAY, -((@@DATEFIRST + 7 - (2 - DATEPART(WEEKDAY, '2020-10-15')) % 7) % 7), '2020-10-15')
    SELECT DATEADD(DAY, -((@@DATEFIRST + 7 - (2 - DATEPART(WEEKDAY, '2020-10-16')) % 7) % 7), '2020-10-16')
    SELECT DATEADD(DAY, -((@@DATEFIRST + 7 - (2 - DATEPART(WEEKDAY, '2020-10-17')) % 7) % 7), '2020-10-17')
    SELECT DATEADD(DAY, -((@@DATEFIRST + 7 - (2 - DATEPART(WEEKDAY, '2020-10-18')) % 7) % 7), '2020-10-18')