从DATEDIFF以decmial格式获取小时和分钟,SQL

时间:2016-07-12 18:52:23

标签: sql sql-server

在我的SQL表中,我有3个coulmns:

StartDateTime (DATETIME),
EndDateTime   (DATETIME),
TimeWorked    (DECIMAL(9,2))

我正在尝试使用开始和结束时间之间的总小时数和分钟来填充TimeWorked列。如果我使用

DATEDIFF(HOUR, StartDateTime, EndDateTime)

我把时间缩小了,所以我想我会用

DATEDIFF(MINUTE, StartDateTime, EndDateTime) / 60

但是在90分钟的时间里我得到了1.00小时。我做了一些搜索,发现大多数地方建议转换数字,所以我尝试只转换DATEDIFF的结果和整个数学方程式如

CONVERT(decimal(9,2),(DATEDIFF(MINUTE, StartDateTime, EndDateTime)) / 60);
CONVERT(decimal(9,2),(DATEDIFF(MINUTE, StartDateTime, EndDateTime) / 60));

但结果仍然是向下舍入到最接近的小时。我用来测试的时间是:

StartDateTime
2014-10-13 17:30:00.000

EndDateTime
2014-10-13 19:00:00.000

以十进制格式获取数字或小时和分钟的最佳方法是什么(即1.5这次是正确的结果)?如果它有任何区别,则会出现在SET语句的UPDATE部分。

3 个答案:

答案 0 :(得分:1)

您可以使用DATEDIFF(MINUTE, StartDateTime, EndDateTime) / 60.0来避免整数除法并获得所需的结果。

这是有效的,因为60.0被解释为decimal而不是integer类型的文字。

您的方法存在问题

 CONVERT(decimal(9,2),(DATEDIFF(MINUTE, StartDateTime, EndDateTime) / 60));

整数除法是否已在演员表之前发生。因此,您只需将整数1转换为decimal

答案 1 :(得分:1)

希望这会对你有所帮助:

DECLARE @StartDate DATETIME
  , @EndDate DATETIME

SELECT  @StartDate = '2014-10-13 17:30:00.000'
SELECT  @EndDate = '2014-10-13 19:00:00.000'

然后选择如下:

SELECT DATEDIFF(MINUTE, @StartDate, @EndDate) / 60.0  

OR

SELECT CONVERT(DECIMAL(9,2), DATEDIFF(MINUTE, @StartDate, @EndDate) / 60.0)

答案 2 :(得分:0)

我认为你也可以使用这个想法:

declare @StartDate datetime, @EndDate datetime

select @StartDate = '2014-10-13 17:30:00.000'
select @EndDate =   '2014-10-13 19:00:00.000'

select convert(varchar(5),DateDiff(s, @startDate, @EndDate)/3600) + ':' 
     + convert(varchar(5),DateDiff(s, @startDate, @EndDate)%3600/60) + ':'
     + convert(varchar(5),(DateDiff(s, @startDate, @EndDate)%60)) as [hh:mm:ss]
,(convert(varchar(5),DateDiff(s, @startDate, @EndDate)/3600)) as H
,(convert(varchar(5),DateDiff(s, @startDate, @EndDate)%3600/60) /60.) as M
,(convert(varchar(5),(DateDiff(s, @startDate, @EndDate)%60)) /60.) as S
,(convert(varchar(5),DateDiff(s, @startDate, @EndDate)/3600)) 
+(convert(varchar(5),DateDiff(s, @startDate, @EndDate)%3600/60) /60.)
+(convert(varchar(5),(DateDiff(s, @startDate, @EndDate)%60)) /60.) as DT_Diff

结果:

hh:mm:ss    H   M           S           DT_Diff
1:30:0      1   0.500000    0.000000    1.500000