计算两个日期时间值之间的小时差

Calculate difference in hours between two datetime values

我正在处理处理一系列电子文档背后的详细信息的查询。每个文档都有一个 CreateDate 和一个 CompletedDate,它们都是 datetime 格式。我的目标是计算这两个日期之间经过的小时数。

SELECT
DocID,
CreateDate,
CompletedDate,
CONVERT(DECIMAL(10,2),DATEDIFF(HOUR,CreateDate,CompletedDate)) AS DiffHours

FROM Documents

这是一个简单的查询,而且效果非常好。但是,我最终得到这样的结果:

DocID   CreateDate                  CompletedDate               DiffHours
--------------------------------------------------------------------------
0001    2021-07-01 08:34:28.130     2021-07-01 08:58:14.633     0.00
0002    2021-07-01 10:33:03.157     2021-07-02 08:37:14.120     22.00

转换为十进制在技术上是可行的,但它仍然只将 DiffHours 结果显示为四舍五入的数字。例如,对于 ID 为 0001 的第一个文档,两次之间还没有经过整整一个小时,但我仍然希望结果显示为 0.42 左右,而不是向下舍入为 0。同样,我本来希望第二个文档显示为 22.[something] 而不仅仅是 22.00.

有没有办法强制计算得更精确?同样,从技术上讲,查询按原样工作,但如果我不能显示正确的小时分数,那么它就不会像我希望的那样有用。

计算 MINUTES 中的增量,然后除以 60 换算成小时。

请注意 60.0 ...这将防止整数除法 return 一个整数。

例子

Declare @YourTable Table ([DocID] varchar(50),[CreateDate] datetime,[CompletedDate] datetime)
Insert Into @YourTable Values 
 ('0001','2021-07-01 08:34:28.130','2021-07-01 08:58:14.633')
,('0002','2021-07-01 10:33:03.157','2021-07-02 08:37:14.120')
 
Select * 
      ,Diff = convert(decimal(15,2),datediff(MINUTE,[CreateDate],[CompletedDate]) / 60.0)
from @YourTable

结果

DocID   CreateDate              CompletedDate            Diff
0001    2021-07-01 08:34:28.130 2021-07-01 08:58:14.633  0.40
0002    2021-07-01 10:33:03.157 2021-07-02 08:37:14.120  22.07

为了获得更高的准确性,您需要使用更高精度的值,例如以秒为单位的差异。

例如

declare @createdate datetime='20210701 08:34:28.130', @CompletedDate datetime='20210701 08:58:14.633'

select Convert(decimal(15,2),DateDiff(second, @createdate,@completeddate)/60.0/60.0)
select Convert(decimal(15,4),DateDiff(second, @createdate,@completeddate)/60.0/60.0)

输出

0.40

0.3961