我必须计算SQL Server 2008中两个日期之间的小时数差异(十进制类型)。
我找不到在MSDN上用'CONVERT'将日期时间转换为十进制的任何有用的技术。
有人可以帮我吗?
更新:
要清楚,我也需要小数部分(因此是十进制类型)。因此,从9:00到10:30,应该返回1.5。
Answers:
DATEDIFF(hour, start_date, end_date)
将为您提供start_date
和之间的小时界限end_date
。
如果需要小数小时数,可以使用DATEDIFF
更高的分辨率并将结果相除:
DATEDIFF(second, start_date, end_date) / 3600.0
DATEDIFF
MSDN上提供了该文档:
http://msdn.microsoft.com/zh-cn/library/ms189794%28SQL.105%29.aspx
datepart
传递给,DATEDIFF
将控制输出的分辨率。例如,如果start_date
和end_date
相差59秒,则DATEDIFF(MINUTE, start_date, end_date) / 60.0
返回0,但DATEDIFF(second, start_date, end_date) / 3600.0
返回0.0163888(59/3600)。
DATEDIFF
以比小时更高的分辨率使用)起作用。例如,SELECT DATEDIFF(second, DATEADD(minute, -15, GETUTCDATE()), GETUTCDATE()) / 3600.0
返回0.250000。
只需减去两个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毫秒。
使用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”的输出
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
您可能正在寻找DATEDIFF函数。
DATEDIFF(datepart,startdate,enddate)
您在哪里编写代码可能如下所示:
DATEDIFF(hh,startdate,enddate)
SELECT DATEDIFF(hh,firstDate,secondDate)FROM tableName在哪里...