【发布时间】:2016-04-20 21:59:43
【问题描述】:
我遇到了一个 SQL 问题。我有一个查询,它创建一个临时表,用其他几个表中的数据填充它,进行一些计算和更新,并将这些数据提供给应用程序。最后一步是计算两个日期时间之间有多少小时和多少分钟,但它们应该被划分为 dayHours、dayMins、nightHours、nightMins(日期时间之间可以是 20 天以上)。以下要点将可视化我想要做什么:
- 比如说,夜间时间是从 23:00 到 06:00。
- 我们有
DateTime1 = 20-04-2016 13:30。 - 我们有
DateTime2 = 21-04-2016 07:15。 - 夜间时间:从 23:00 到 06:00 = 7 小时 0 分钟。
- 白天:从 13:30 到 23:00(9 小时 30 分),然后从 06:00 到次日 07:15(1 小时 15 分),总共 10 小时 45 分钟。
我提供了一个create table 查询,但我只需要计算方面的帮助,因此您可以忽略我的表格和数据。请注意,我已经几乎删除了所有格式以减少,因为帖子真的很长。
CREATE TABLE [dbo].[myTestTable](
[JHID] [int] NULL, [ToDateTime] [datetime] NULL,
[startPayDateTime] [datetime] NULL, [opDayHour] [int] NULL,
[opDayMin] [int] NULL, [opNightHour] [int] NULL,
[opNightMin] [int] NULL, ) ON [PRIMARY] GO
考虑将其作为测试数据插入。列(用于测试目的)是 startPayDateTime 和 ToDateTime
INSERT INTO [myTestTable]
([JHID],[ToDateTime],[startPayDateTime],[opDayHour],[opDayMin],[opNightHour],[opNightMin])
VALUES (301533,'14-03-2016 01:54','14-03-2016 04:54',1,1,1,1),
(302488,'14-03-2016 01:54','14-03-2016 08:31',0,0,0,0),
(302676,'14-03-2016 01:54','28-03-2016 08:11',1,1,1,1) GO
所以现在我必须
UPDATE
SET opDayHour = (CASE WHEN ... THEN *value* ELSE 0 end),
opDayMin = (CASE WHEN ... THEN *value* ELSE 0 end),
opNightHour = (CASE WHEN ... THEN *value* ELSE 0 end),
opNightMin = (CASE WHEN ... THEN *value* ELSE 0 end),
如何感谢您的考虑,如果我的问题不够清楚,请发表评论! :)
【问题讨论】:
-
你看过DATEDIFF吗?
-
@BerndLinde 是的。我的第一个想法是采用 DATEDIFF(MINUTE, StartDate, EndDate)。我通常是 C# 开发人员,我会在白班或夜班开始时循环,最后添加剩余部分。我尝试在 SQL 中这样做,但无济于事。
-
计算两个日期之间经过的总天数:
DATEDIFF(day, dt1, dt2)。对于每一天,您都知道它有多少昼夜分钟。然后附加部分天的白天和黑夜持续时间。它可能需要一堆嵌套的case表达式,但不需要循环。
标签: sql sql-server