2017-02-22 71 views
0

当我通过下面的代码计算时间差时,它显示了相反顺序的差异为什么?以小时计算时间差时出现意外结果?

declare @startdate time = '08:00:00', @enddate time = '01:00:00' 
declare @hour varchar(25),@minutes varchar(25),@seconds varchar(25) 

set @hour=datediff(ss,@startdate,@enddate)/60/60%12 
set @minutes= datediff(ss,@startdate,@enddate)/60%60 
set @seconds= datediff(ss,@startdate,@enddate)%60 

select @hour+':'[email protected]+':'[email protected] 

我正在计算12小时的差异。我期待的差别是5个小时。但它显示我-7小时。有人可以解释吗?

回答

3

默认情况下,sql server采用24小时格式。 您可以指定它是A.M还是P.M.

declare @startdate time = '08:00:00 AM', @enddate time = '01:00:00 PM' 
SELECT DATEDIFF(HH,@startdate,@enddate) 

这个工作,如果指定的时间不涉及两个不同的日期,除非提及。 例如:

declare @startdate time = '08:00:00 PM', @enddate time = '01:00:00 PM' 
    SELECT DATEDIFF(HH,@startdate,@enddate) 

这将导致一个错误的值作为@enddate落在下一个日期。 为了获得更好的结果,建议指定日期和时间。

select datediff(HH, '02-21-2017 08:00:00 pm' ,'02-22-2017 01:00:00 PM') 
2

该输出完全正确。 01:00在08:00后7小时。这就是为什么你得到一个负数。

你说你用12小时计算差值。好吧,那么你需要以某种方式向SQL Server表明。可以使用13:00作为结束时间,也可以在时间字符串中使用AMPM子午线指标解析日期。

高度建议你只处理24小时的时间。它会让你头痛不已,让你的代码更容易理解。节省UI层的时间显示和解析。

+0

感谢您的澄清,但现在我正在采取startdate = '08:00:00 pm'和enddate = '01:00:00 pm'但仍然卡住相同的结果,即-7和输出应该是17小时因为时间从晚上8点到下午1点开始。为什么?使用12和24时钟 –

+0

尝试传递日期和时间。它应该产生你想要的结果。 – Vikram

+0

正确工作,谢谢 –