首页 > 解决方案 > 周开始日期 SQL 疑难解答

问题描述

我一直在使用 SQL 查询代码行,它给出了从星期一开始的周开始日期。它在大多数情况下运行良好,但遇到了一个被错误分组的特定日期(星期日,08/08/21)。有人可以帮助解释可能导致这种情况的原因吗?

我正在使用的代码行如下:

FORMAT(CONVERT(DATE,DATEADD(dd, -(DATEPART(dw, a.TicketDate)-2), a.TicketDate)),'MM/dd/yy') as WeekStart
周开始 出票日期
21 年 8 月 2 日 21 年 8 月 4 日
21 年 8 月 2 日 21 年 8 月 5 日
21 年 8 月 9 日 21 年 8 月 8 日
21 年 8 月 9 日 21 年 8 月 9 日
21 年 8 月 9 日 21 年 8 月 10 日

标签: sql-server

解决方案


除了您的 SQL 计算实际上没有按照您认为的那样进行之外,这里没有什么不寻常的事情发生,因为数学是不正确的。如果您将表达式分解为其组成部分,您将看到 Sundays 返回 a-1作为您的-(datepart(weekday, a.TicketDate)-2)that的结果dateadd

如果您不能为此使用日期表(以及它们使许多其他事情变得容易),您只需要更正表达式中的数学:

询问

select cast(a.TicketDate as date) as TicketDate
      ,cast(a.PriorMonday as date) as PriorMonday
      ,cast(dateadd(day,1,dateadd(day, -(datepart(weekday, dateadd(day,-1,a.TicketDate))), a.TicketDate)) as date) as Calc
from (values('20210801','20210726')
           ,('20210802','20210802')
           ,('20210803','20210802')
           ,('20210804','20210802')
           ,('20210805','20210802')
           ,('20210806','20210802')
           ,('20210807','20210802')
           ,('20210808','20210802')
           ,('20210809','20210809')
           ,('20210810','20210809')
           ,('20210811','20210809')
           ,('20210812','20210809')
           ,('20210813','20210809')
           ,('20210814','20210809')
           ,('20210815','20210809')
     ) as a(TicketDate,PriorMonday)

输出

出票日期 前星期一 计算
2021-08-01 2021-07-26 2021-07-26
2021-08-02 2021-08-02 2021-08-02
2021-08-03 2021-08-02 2021-08-02
2021-08-04 2021-08-02 2021-08-02
2021-08-05 2021-08-02 2021-08-02
2021-08-06 2021-08-02 2021-08-02
2021-08-07 2021-08-02 2021-08-02
2021-08-08 2021-08-02 2021-08-02
2021-08-09 2021-08-09 2021-08-09
2021-08-10 2021-08-09 2021-08-09
2021-08-11 2021-08-09 2021-08-09
2021-08-12 2021-08-09 2021-08-09
2021-08-13 2021-08-09 2021-08-09
2021-08-14 2021-08-09 2021-08-09
2021-08-15 2021-08-09 2021-08-09

推荐阅读