【发布时间】:2020-04-12 16:16:50
【问题描述】:
我需要计算不同日期之间的营业时间(上午 8 点至下午 5 点)。这是场景:
票被分配给员工 (Ticket_Submission (DateTime)),然后员工创建产品 (Build_Date (Datetime)),现在有时为了创建产品需要制造药物 (Med_Date (Datetime) )。为了计算员工创建产品所需的时间,
我需要DATEDIFF 在Ticket_submission AND Build_Date 之间,但是,如果涉及药物,它必须在Med_Date AND Build_Date 之间。可以包括周末和节假日。以下帮助我了解天数的不同:
.....
,IIF((med_date = buid_date OR ticket_submission = build_date), 1
, IIF(med_date IS NULL OR med_date < ticket_submission , (DATEDIFF(dd, ticket_submission,build_date))
, DATEDIFF(dd, med_date, build_date))) AS buildcompletedate,….
这只给了我天数,而且,我知道如果不是 DD,我输入小时数,我可以获得两个日期之间的总小时数。但是,我怎样才能在工作时间拥有这些?
非常感谢您的帮助。
ticketID Ticket_submission Med_Date Build_Date
1549392 2017-04-07 10:31:06:210 2017-04-08 11:31:06:210 2017-04-09 12:30:08:110
1751406 2017-06-06 4:30:08:200 2018-08-06 3:30:08:200 2018-09-10 3:30:08:200
2583870 2019-11-20 1:20:01:100 NULL 2019-11-23 2:20:01:100
为了帮助构建测试样本,这里有一个在内存中构建测试样本的通用表表达式:
; with Ticket (TicketID, Ticket_Submission, Med_Date, Build_Date)
AS
(
SELECT TicketID = 1549392, Ticket_Submission = CAST('2017-04-07 10:31:06:210' AS DATETIME2), Med_Date = CAST('2017-04-08 11:31:06:210' AS DATETIME2), Build_Date = CAST('2017-04-09 12:30:08:110' AS DATETIME2) UNION ALL
SELECT 1751406, CAST('2017-06-06 4:30:08:200' AS DATETIME2), CAST('2018-08-06 3:30:08:200' AS DATETIME2), CAST('2018-09-10 3:30:08:200 ' AS DATETIME2) UNION ALL
SELECT 2583870, CAST('2019-11-20 1:20:01:100' AS DATETIME2), CAST(NULL AS DATETIME2), CAST('2019-11-23 2:20:01:100' AS DATETIME2)
)
select
TicketID,
0 AS RoundedBusinessHoursBetweenDates /* Update with answer code */
from Ticket
预期结果
TicketID RoundedBusinessHoursBetweenDates
-------- --------------------------------
1549392 10
1751406 307
2583870 20????
四舍五入
- 可以整小时
- 例如,不是 4 小时 30 分钟,而是 5 小时。
逐步理解计算
- 对于第一行 (TicketID 1549392),我希望看到:
- 10 小时(第一天上午 11:31 至下午 5 点约 5 小时 30 分钟)+ 第二天上午 8 点至 12:30 约 4.5 小时)
- 对于第二行 (TicketID 1751406),我希望看到:
- 第一天 2 小时(针对 med_build 日期)+ 最后一天 8 小时(上午 8 点到下午 3:30)+ 9 * 这两天之间的剩余天数
- 对于第三行(TicketID 2583870),如果
Med_Date是NULL,那么只有从ticket_submission 到build_date 的区别
【问题讨论】:
-
如果您可以将测试数据以文本格式并提供营业时间会更容易
-
文本形式的示例数据和所需结果将是最有帮助的。
-
@Avi 已发布,谢谢。
-
@JohnCappelletti,已发布,谢谢。
-
必须考虑假期(每个国家/地区可能有不同的日子).. 可以实现一个标量函数,返回已过去的工作小时数,工作日间隔及其时间表,休息日和节假日
标签: sql sql-server