这似乎是一个常见的问题,我似乎找不到答案,所以希望一些新的见解请。
我需要找到前一个星期一的日期,除非传递给语句的日期本身就是星期一,否则我需要使用该日期。
我尝试了以下方法
DATEADD(wk, DATEDIFF(wk,0,StartDate), 0)
这将返回正确的日期,除非是星期日,否则它将返回下一个星期一而不是上一个星期一。
DATEADD(wk, DATEDIFF(wk,0,StartDate), -1)
这将返回星期日而不是星期一。
DATEADD(DAY, 1 - DATEPART(WEEKDAY, StartDate), StartDate)
星期天也会返回。
有什么办法解决吗?
1条答案
按热度按时间tp5buhyn1#
以Greg Hewgill的answer为灵感,一种方法是使用他们的表达式来获得一个明确的日期编号,其中Monday为
0
,Sunday为6
,然后从当前日期中 * 减去 * 该日期编号:或者,在最新版本的数据引擎上,您可以使用
DATE_BUCKET
。与DATEPART
不同,DATE_BUCKET
不受语言设置的影响,例如一周的开始时间。当省略其第4个参数时,它总是使用1900-01-01
作为开始日期,这很方便(此处)是星期一。这意味着如果省略该参数,则查询“周时段”的开始日期也将返回星期一。同样受El.MENSI的启发,现在的deleted answer尝试使用
DATE_TRUNC
(可能是MySQL语法),虽然不能使用WEEK
进行截断,但可以使用ISO_WEEK
,它总是从星期一开始,不过这也只在最新版本的数据引擎上支持: