sql-server - 周开始日期 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 计算实际上没有按照您认为的那样进行之外,这里没有什么不寻常的事情发生,因为数学是不正确的。如果您将表达式分解为其组成部分,您将看到 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 |
推荐阅读
- python - 从 Heroku 上的 Flask App 获取访问者的 IP
- node.js - 在 Node/Express 中,如何获取当前路由处理程序?
- java - 我一运行项目,Java .class 文件就会消失
- c# - 通过 dapper 动态参数将 int 列表发送到 sql sp
- django - /admin/accounts/user/1/change/ 'User' 对象的 AttributeError 没有属性 'profile'
- jquery - Ideal Forms 3 自定义正则表达式验证
- docker - 为什么 docker 容器的行为不同?
- excel - 带有匹配和不匹配的 Vlookup 返回 VBA 中的特定值。请找到以下代码。我需要知道如何获得匹配值
- python - 使用主脚本中的变量调用基本脚本的主 python 脚本
- azure - 无法使用 ARM 在应用服务计划上创建基于 Windows (OS) 的函数应用