sql - Datediff 不包括周末
问题描述
我有一个查询计算两个日期之间的周转时间、天数差。日期在申请批准的业务流程中。
因此,如果第一个用户在星期五批准申请,下一个用户在星期一批准,则预期 TAT 为 1。
我已经设法实现了这个结果,除了在一个罕见的情况下,两个批准都在周末完成,返回的 TAT 为 -1,如下所示:
我希望它返回 0 的 TAT。
以下是我的 datediff 计算:
SELECT STEP_ONE, STEP_TWO,
(DATEDIFF(dd, STEP_ONE,STEP_TWO))
-(DATEDIFF(wk, STEP_ONE,STEP_TWO) * 2)
-(case datepart(dw, STEP_ONE)+@@datefirst when 8 then 1 else 0 end)
-(case datepart(dw, STEP_TWO)+@@datefirst when 7 then 1 when 14 then 1 else 0 end)
AS TAT
FROM TEST_1
解决方案
此方法检查 TAT 是否为负,如果是,则返回 0:
SELECT STEP_ONE, STEP_TWO,
IIF (
(DATEDIFF(dd, STEP_ONE,STEP_TWO))
-(DATEDIFF(wk, STEP_ONE,STEP_TWO) * 2)
-(case datepart(dw, STEP_ONE)+@@datefirst when 8 then 1 else 0 end)
-(case datepart(dw, STEP_TWO)+@@datefirst when 7 then 1 when 14 then 1 else 0 end)
<= 0,
0,
(DATEDIFF(dd, STEP_ONE,STEP_TWO))
-(DATEDIFF(wk, STEP_ONE,STEP_TWO) * 2)
-(case datepart(dw, STEP_ONE)+@@datefirst when 8 then 1 else 0 end)
-(case datepart(dw, STEP_TWO)+@@datefirst when 7 then 1 when 14 then 1 else 0 end)
) AS TAT
FROM TEST_1
这两个 4 行的长表达式每个都与您编写的相同。
编辑:要使条件仅影响在周末计算的 TAT(正如您在下面的评论中所要求的),您可以将 IIF 包装在另一个询问周末的 IIF 中。这是产生的更长的查询:
SELECT STEP_ONE, STEP_TWO,
IIF (@@DATEFIRST = 1 AND (DatePart(dw, STEP_ONE) > 5 OR DatePart(dw, STEP_TWO) > 5)
OR @@DATEFIRST = 7 AND (DatePart(dw, STEP_ONE) IN (1, 7) OR DatePart(dw, STEP_TWO) IN (1, 7)),
IIF (
(DATEDIFF(dd, STEP_ONE,STEP_TWO))
-(DATEDIFF(wk, STEP_ONE,STEP_TWO) * 2)
-(case datepart(dw, STEP_ONE)+@@datefirst when 8 then 1 else 0 end)
-(case datepart(dw, STEP_TWO)+@@datefirst when 7 then 1 when 14 then 1 else 0 end)
<= 0,
0,
(DATEDIFF(dd, STEP_ONE,STEP_TWO))
-(DATEDIFF(wk, STEP_ONE,STEP_TWO) * 2)
-(case datepart(dw, STEP_ONE)+@@datefirst when 8 then 1 else 0 end)
-(case datepart(dw, STEP_TWO)+@@datefirst when 7 then 1 when 14 then 1 else 0 end
)),
(DATEDIFF(dd, STEP_ONE,STEP_TWO))
-(DATEDIFF(wk, STEP_ONE,STEP_TWO) * 2)
-(case datepart(dw, STEP_ONE)+@@datefirst when 8 then 1 else 0 end)
-(case datepart(dw, STEP_TWO)+@@datefirst when 7 then 1 when 14 then 1 else 0 end)
) AS TAT
FROM TEST_1
推荐阅读
- javascript - Javascript 解析日期 Contract_End_Date
- android - 在 Kotlin Multiplatform 上复制到剪贴板
- google-cloud-platform - 系统尚未使用 systemd 作为 init system (PID 1) 引导。不能操作。无法连接到总线:主机已关闭
- sql - NoSQL 或 SQL 或其他用于缩放 Excel 电子表格的工具
- node.js - Graphql Mysql - 从 JSON 格式的表中获取行
- excel - VBA Excel 中的索引匹配函数的错误处理
- c# - 如何在带有 LINQ 的子查询中使用 GroupBy()?
- javascript - 如何将分页应用于 json-server 中的子对象?
- c# - 当声明 broadFileSystemAccess 时触发用户同意对话框
- android - Appium+ WebdriverIO 查找元素问题