如何计算军用时间中2个时间戳之间的小时数?

问题描述

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

SwipeTime                                  
2019-02-01 18:53:00.740 +0000               

RequestDate
2019-02-01 18:45:52.640 -0500

我需要找到 SwipeTime 和 RequestDate 之间的小时数,以便我可以为不同的时间段创建存储桶。我试过: datediff(hour,a.SwipeTime,a.requestdate) as 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.requestdate) 返回值 -14。这让我很难过,我不确定如何在两个时间戳之间获得正确的小时数,即 18 小时。任何帮助将不胜感激!

select 
    a.applicationnumber,a.requestdate,datediff(hour,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),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,27) + ':' + substring(x.RequestTime,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.SwipeTime)) + 4
END AS delta