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


84

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

我找不到在MSDN上用'CONVERT'将日期时间转换为十进制的任何有用的技术。
有人可以帮我吗?

更新:
要清楚,我也需要小数部分(因此是十进制类型)。因此,从9:00到10:30,应该返回1.5。

Answers:


162

DATEDIFF(hour, start_date, end_date)将为您提供start_date和之间的小时界限end_date

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

DATEDIFF(second, start_date, end_date) / 3600.0

DATEDIFFMSDN上提供了该文档:

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


很好的主意。顺便说一句-.Net中也存在相同的功能,因此在VB.Net或C#中很有用。
杰夫,

1
为什么不DATEDIFF(MINUTE,start_date,end_date)/ 60.0
irfandar

8
@irfandardatepart传递给,DATEDIFF将控制输出的分辨率。例如,如果start_dateend_date相差59秒,则DATEDIFF(MINUTE, start_date, end_date) / 60.0返回0,但DATEDIFF(second, start_date, end_date) / 3600.0返回0.0163888(59/3600)。
菲尔·罗斯

这个解决方案只是返回整数。如果时差只有15分钟,则小时返回0。我认为以下解决方案更现实。
Asad Naeem

1
@AsadNaeem解决方案(DATEDIFF以比小时更高的分辨率使用)起作用。例如,SELECT DATEDIFF(second, DATEADD(minute, -15, GETUTCDATE()), GETUTCDATE()) / 3600.0返回0.250000。
Phil Ross

15

只需减去两个datetime值并乘以24:

  Select Cast((@DateTime2 - @DateTime1) as Float) * 24.0

测试脚本可能是:

  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

之所以可行,是因为所有日期时间都在内部存储为一对整数,第一个整数是自1900年1月1日以来的天数,第二个整数(代表时间)是自午夜以来的(1滴答数。(对于SmallDatetimes,时间部分整数是自午夜以来的分钟数)。对值进行的任何算术都将时间部分作为一天的一部分。6am = 0.25,中午= 0.5,依此类推...请参见此处的MSDN链接更多详细信息。

因此Cast((@ Dt2-@ Dt1)为Float)会为您提供两个日期时间之间的总天数。乘以24可转换为小时。如果您需要总分钟数,请选择每天乘以分钟(24 * 60 = 1440),而不是24 ...

注意1:这与dotNet或javaScript滴答不同-此滴答约为3.33毫秒。


好招 SQL应该包括一个命名常量。键入24时我感觉很脏,但是我想这就是我没有成为罗纳德·麦当劳的经历。
艾伦(Allen)

10

DATEDIFF,但请注意,它返回一个整数,因此,如果您需要几分之一小时,请使用以下内容:

CAST(DATEDIFF(ss, startDate, endDate) AS decimal(precision, scale)) / 3600

2

使用Postgres,我在DATEDIFF上遇到了问题,但是在此方面取得了成功:

  DATE_PART('day',(delivery_time)::timestamp - (placed_time)::timestamp) * 24 + 
  DATE_PART('hour',(delivery_time)::timestamp - (placed_time)::timestamp) +
  DATE_PART('minute',(delivery_time)::timestamp - (placed_time)::timestamp) / 60

这给了我类似“ 14.3”的输出


0
Declare @date1 datetime
Declare @date2 datetime

Set @date1 = '11/20/2009 11:00:00 AM'
Set @date2 = '11/20/2009 12:00:00 PM'

Select Cast(DateDiff(hh, @date1, @date2) as decimal(3,2)) as HoursApart

结果= 1.00


1
DateDiff()返回一个int。您可以将其转换为十进制,但是它已经被截断了尾数。
Joel Coehoorn


0
DATEDIFF(minute,startdate,enddate)/60.0)

或将其用于2个小数位:

CAST(DATEDIFF(minute,startdate,enddate)/60.0 as decimal(18,2))

-1

SELECT DATEDIFF(hh,firstDate,secondDate)FROM tableName在哪里...


DateDiff()返回一个int。您可以将其转换为十进制,但是它已经被截断了尾数。
Joel Coehoorn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.