如何计算军事时间中两个时间戳之间的小时数



我试图在SQL Server中查找两个时间戳之间的小时数。数据的结构如下:

SwipeTime                                  
2019-02-01 18:53:00.740 +0000               
RequestDate
2019-02-01 18:45:52.640 -0500

我需要找到SwipeTime和RequestDate之间的小时数,这样我就可以为不同的时间段创建bucket。我尝试过:datediff(hour,a.SwipeTime,a.requestdate(作为delta这返回了一个值5,我知道它来自RequestDate时间戳的"-0500"部分。我感到困惑的地方在这个例子中:

SwipeTime                                  
2019-01-18 12:21:47.648 +0000               
RequestDate
2019-01-17 17:46:57.380 -0500

在这种情况下,SwipeTime是第二天,但datediff(hour,a.SwipeTime,a.requestdate)返回的值为-14。这让我很困惑,我不知道如何获得两个时间戳之间的正确小时数,即18小时。任何帮助都将不胜感激!

select 
a.applicationnumber
, a.SwipeTime
, a.requestdate
, datediff(hour,a.requestdate,a.SwipeTime) as delta
from swipe

我更倾向于正确地做到这一点,即将字符串数据转换为实际的datetimeoffset数据,您可以直接转换为datetime以忽略时区。

这是一个更稳健的解决方案,因为它不需要了解数据形状。一旦数据是原生数据类型,就更容易正确操作它。

select y.SwipeTime, y.RequestTime
-- calculate different ignoring timezone by converting to regular datetime
, datediff(hour, convert(datetime,y.RequestTime), convert(datetime,y.SwipeTime))
from (
-- Incoming values
values ('2019-01-18 12:21:47.648 +0000', '2019-01-17 17:46:57.380 -0500')
) x (SwipeTime, RequestTime)
cross apply (
-- Convert to actual datetimeoffset datatype
values (convert(datetimeoffset,substring(x.SwipeTime,1,27) + ':' + substring(x.SwipeTime,28,2)), convert(datetimeoffset,substring(x.RequestTime,1,27) + ':' + substring(x.RequestTime,28,2)))
) y (SwipeTime, RequestTime);

我能够解决这个问题。在阅读了戴尔的评论后,我意识到我在概念上没有正确思考两次之间的区别。在研究数据后,我发现它有4或5个小时的偏移量。为了说明这一点,我使用了这个查询,它有效:

CASE
WHEN substring(a.requestdate,27,1)='5' then (datediff(hour,a.requestdate,a.SwipeTime)) + 5
ELSE (datediff(hour,a.requestdate,a.SwipeTime)) + 4
END AS delta

最新更新