计算两个日期时间值之间的小时差
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
我正在处理处理一系列电子文档背后的详细信息的查询。每个文档都有一个 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