我正在处理一个SQL问题。我有一个查询使临时表,使用其他几个表中的数据填充它,进行一些计算和更新,并将这些数据提供给应用程序。最后一步是计算两个日期之间有多少个小时以及多少分钟,但是它们应该分为dayHours,dayMins,nightHours,nightMins(日期时间可以在两次之间)。下面的要点将形象化我想要做的事情:SQL计算两个日期时间值之间的DayTime和NightTime
- 比方说,晚上的时间是从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(9h30m),然后再从06:00到第二天的06:15(1h15m)共计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](https://msdn.microsoft.com/en-us/library/ms189794.aspx)? –
@BerndLinde是的。我的第一个想法是采取DATEDIFF(MINUTE,StartDate,EndDate)。我通常是一个C#开发人员,在那里我会做一个循环到开始移动或夜移,并在最后添加剩余部分。我试图在SQL中这样做,但无济于事。 –
计算两个日期之间传递的整个天数:'DATEDIFF(day,dt1,dt2)'。对于每一整天你知道它有多少个日夜分钟。然后为部分日子添加日夜时间。它可能需要一堆嵌套的'case'表达式,但不需要循环。 –