Sql server 查找当前周的开始日(星期一)

Sql server 查找当前周的开始日(星期一),sql-server,tsql,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 Tu

正在查找一个或多个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
我在谷歌和StackOverflow上看到了很多“解决方案”。这张照片看起来像:

SET @pInputDate = CONVERT(VARCHAR(10), @pInputDate, 111)
SELECT DATEADD(DD, 1 - DATEPART(DW, @pInputDate), @pInputDate)
这失败是因为: 2010年10月10日星期日->2010年10月11日星期一的开始(这是不正确的)。

尝试使用将一周中的某一天明确设置为“第一天”

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

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

建立在p.campbell的解决方案之上,如果您不想使用或无法使用“SET DATEFIRST 1”,您可以通过执行以下操作来解决此问题:

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

您不需要使用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

您需要先使用DATEFIRST。没有它,您的代码总是将星期天指定为“错误”的一周:

选择DATEADD(wk,DATEDIFF(wk,0,'2020-10-11'),0)-->Sunday->2020-10-12
选择DATEADD(wk,DATEDIFF(wk,0,'2020-10-12'),0)-->Monday->2020-10-12
选择DATEADD(wk,DATEDIFF(wk,0,'2020-10-18'),0)-->Sunday->2020-10-19
在这种情况下,需要考虑2个因素:

  • @@DATEFIRST
  • 星期几开始(对我来说是星期一)
  • 例如:以下所有行生成2020-10-12(从2020-10-12年的星期一开始到2020-10-18年的星期日结束的一周的星期一),而不考虑
    @@DATEFIRST
    值:

    选择DATEADD(日期,(@@DATEFIRST+7-(2-DATEPART(工作日,'2020-10-12'))%7)%7),'2020-10-12')
    选择DATEADD(日期),(@@DATEFIRST+7-(2-DATEPART(工作日,'2020-10-13'))%7),'2020-10-13')
    选择DATEADD(日期),(@@DATEFIRST+7-(2-DATEPART(工作日,'2020-10-14'))%7),'2020-10-14')
    选择DATEADD(日期),(@@DATEFIRST+7-(2-DATEPART(工作日,'2020-10-15'))%7),'2020-10-15')
    选择DATEADD(日期),(@@DATEFIRST+7-(2-DATEPART(工作日,'2020-10-16'))%7),'2020-10-16')
    选择DATEADD(日期),(@@DATEFIRST+7-(2-DATEPART(工作日,'2020-10-17'))%7),'2020-10-17')
    选择DATEADD(日期),(@@DATEFIRST+7-(2-DATEPART(工作日,'2020-10-18'))%7),'2020-10-18')
    
    最简单的实现


    选择DATEADD(wk,DATEDIFF(wk,0,GETDATE()),0)当前周的星期一

    是否只需要查找星期一或一周的第一个工作日?我想要一周的开始(星期一),无论是工作日还是假日。我找到了另一个解决方案,但这个解决方案更简单、更简洁。谢谢。我们怎样才能找到上周一到上周一?我试着在表达式中用2代替1,但没有成功。有什么建议吗?谢谢,这一条SQL语句在SAP Universe对象定义中为我带来了好处。通过识别周开始日期,我可以对周运行图绘图进行聚合。