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

时间:2009-11-20 14:01:18

标签: sql-server tsql datetime decimal

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

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

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

7 个答案:

答案 0 :(得分:140)

DATEDIFF(hour, start_date, end_date)会为您提供start_dateend_date之间的小时边界数。

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

DATEDIFF(second, start_date, end_date) / 3600.0

MSDN上提供了DATEDIFF的文档:

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

答案 1 :(得分:14)

只需减去两个日期时间值并乘以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 link here

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

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

答案 2 :(得分:9)

DATEDIFF,但请注意它会返回一个整数,所以如果你需要几小时的时间,请使用以下内容: -

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

答案 3 :(得分:1)

使用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”的输出

答案 4 :(得分: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

答案 5 :(得分:0)

您可能正在寻找DATEDIFF功能。

  

DATEDIFF(datepart,startdate,enddate)

您的代码可能如下所示:

DATEDIFF(hh,startdate,enddate)

答案 6 :(得分:-1)

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