如何计算SQL Server中两个日期之间的小时(十进制)差异?

Mar*_*arc 76 t-sql sql-server datetime decimal

我必须计算SQL Server 2008中两个日期之间的小时数(十进制类型).

在MSDN上使用'CONVERT'将datetime转换为十进制时,我找不到任何有用的技术.
任何人都可以帮助我吗?

更新:
要清楚,我也需要小数部分(因此十进制类型).所以从9点到10点30分它应该还给我1.5.

Phi*_*oss 148

DATEDIFF(hour, start_date, end_date)会给你start_date和之间交叉的小时数end_date.

如果您需要小时数,可以使用DATEDIFF更高的分辨率并将结果除以:

DATEDIFF(second, start_date, end_date) / 3600.0
Run Code Online (Sandbox Code Playgroud)

DATEDIFFMSDN上提供了相关文档:

http://msdn.microsoft.com/en-us/library/ms189794%28SQL.105%29.aspx

  • @irfandar传递给`DATEDIFF`的`datepart`将控制输出的分辨率.例如,如果`start_date`和`end_date`相差59秒,那么`DATEDIFF(MINUTE,start_date,end_date)/ 60.0`将返回0,但是`DATEDIFF(second,start_date,end_date)/ 3600.0`将返回0.0163888( 3600分之59). (5认同)
  • 为什么不是 DATEDIFF(MINUTE, start_date, end_date) / 60.0 (2认同)

Cha*_*ana 14

只需减去两个日期时间值并乘以24:

  Select Cast((@DateTime2 - @DateTime1) as Float) * 24.0
Run Code Online (Sandbox Code Playgroud)

测试脚本可能是:

  Declare @Dt1 dateTime Set @Dt1 = '12 Jan 2009 11:34:12'
  Declare @Dt2 dateTime Set @Dt2 = getdate()

  Select Cast((@Dt2 - @Dt1) as Float) * 24.0
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为所有日期时间都在内部存储为一对整数,第一个整数是自1900年1月1日以来的天数,第二个整数(表示时间)是自午夜以来的(1)个滴答数.(对于SmallDatetimes,时间部分整数是自午夜以来的分钟数).对值进行的任何算术都将时间部分用作一天的一小部分.早上6点= 0.25,中午= 0.5等...有关详细信息,请参阅此处的MSDN链接.

所以Cast((@ Dt2 - @ Dt1)为Float)给出两个日期时间之间的总天数.乘以24转换为小时.如果您需要总分钟数,则每天多个分钟(24*60 = 1440)而不是24分钟...

注1:这与dotNet或javaScript tick不同 - 此刻度约为3.33毫秒.


Ant*_*nes 9

DATEDIFF但请注意它返回一个整数,所以如果你需要几小时的时间使用这样的东西: -

CAST(DATEDIFF(ss, startDate, endDate) AS decimal(precision, scale)) / 3600
Run Code Online (Sandbox Code Playgroud)