SQL Server 我需要前一个星期一的日期,除非今天是星期一,否则使用今天的日期

bd1hkmkf  于 2023-01-20  发布在  其他
关注(0)|答案(1)|浏览(172)

这似乎是一个常见的问题,我似乎找不到答案,所以希望一些新的见解请。
我需要找到前一个星期一的日期,除非传递给语句的日期本身就是星期一,否则我需要使用该日期。
我尝试了以下方法

DATEADD(wk, DATEDIFF(wk,0,StartDate), 0)

这将返回正确的日期,除非是星期日,否则它将返回下一个星期一而不是上一个星期一。

DATEADD(wk, DATEDIFF(wk,0,StartDate), -1)

这将返回星期日而不是星期一。

DATEADD(DAY, 1 - DATEPART(WEEKDAY, StartDate), StartDate)

星期天也会返回。
有什么办法解决吗?

tp5buhyn

tp5buhyn1#

Greg Hewgillanswer为灵感,一种方法是使用他们的表达式来获得一个明确的日期编号,其中Monday为0,Sunday为6,然后从当前日期中 * 减去 * 该日期编号:

SELECT DATEADD(DAY,-(DATEPART(WEEKDAY,GETDATE())  + @@DATEFIRST + 5) % 7,CONVERT(date,GETDATE()))

或者,在最新版本的数据引擎上,您可以使用DATE_BUCKET。与DATEPART不同,DATE_BUCKET不受语言设置的影响,例如一周的开始时间。当省略其第4个参数时,它总是使用1900-01-01作为开始日期,这很方便(此处)是星期一。这意味着如果省略该参数,则查询“周时段”的开始日期也将返回星期一。

SELECT DATE_BUCKET(WEEK,1,GETDATE());

同样受El.MENSI的启发,现在的deleted answer尝试使用DATE_TRUNC(可能是MySQL语法),虽然不能使用WEEK进行截断,但可以使用ISO_WEEK,它总是从星期一开始,不过这也只在最新版本的数据引擎上支持:

SELECT DATE_TRUNC(ISO_WEEK, GETDATE());

相关问题