【问题标题】:Calculate difference in hours between two datetime values计算两个日期时间值之间的小时差
【发布时间】:2021-10-09 23:07:56
【问题描述】:

我正在处理一个处理一系列电子文档背后的详细信息的查询。每个文档都有一个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

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

【问题讨论】:

  • 答案没有提到 datediff 计算两个日期之间的边界的事实,例如2020-01-01 00:59:592020-01-01 01:00:00 相隔一秒,但 datediff(hour, ...) 表示它们相隔一小时。
  • @SalmanA 啊,有道理
  • @SalmanA 在计算小时差时确实如此,但两个答案都没有;您也可以在午夜的任一侧设置日期时间,以秒分隔,以 days 为单位测量的 datediff 也将导致 1

标签: sql sql-server tsql datetime datediff


【解决方案1】:

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

注意 60.0 ...这将阻止整数除法,这将返回一个整数。

示例

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

【讨论】:

    【解决方案2】:

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

    例如

    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

    【讨论】:

      猜你喜欢
      • 2021-11-25
      • 2011-08-01
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 2014-06-30
      相关资源
      最近更新 更多