如何在SQL Server中获取两个日期的时差

时间:2013-12-17 09:15:02

标签: sql sql-server datetime

我试图通过以下代码查询两个日期之间的时差:

DECLARE @firstDate DATETIME
DECLARE @SecondDate DATETIME

SELECT 
    CONVERT(VARCHAR(5), DATEDIFF(dd, @firstDate, @SecondDate)) + ' Days ' + 
    CONVERT(VARCHAR(5), (DATEDIFF(hh, @firstDate, @SecondDate) - DATEDIFF(dd, @firstDate, @SecondDate) * 24) % 3600) + ':' + 
    CONVERT(VARCHAR(5), DATEDIFF(s, @firstDate, @SecondDate) % 3600 / 60)  + ':' + 
    CONVERT(VARCHAR(5), DATEDIFF(s, @firstDate, @SecondDate) % 60) AS Time_remain_In_Days

但如果

,它会产生有问题的输出
set @firstDate = '2013-12-17 15:35'
set @SecondDate = '2013-12-18 14:35'

输出为 1天-1:0:0

但它应该是 0天23:0:0

我已经在视图中编写了上面的代码。

请帮我修改上述查询以获得所需的输出

2 个答案:

答案 0 :(得分:5)

如果您使用的是SQL Server 2008或更高版本,则应该这样做:

declare @firstDate datetime
declare @SecondDate datetime
set @firstDate='2013-12-17T15:35:00'
set @SecondDate='2013-12-18T14:35:00'

select
    CONVERT(varchar(10),DATEDIFF(second,@firstDate,@secondDate)/86400)
        + ' days ' +
    CONVERT(varchar(10),CONVERT(time,
        DATEADD(second,DATEDIFF(second,@firstDate,@secondDate)%86400,0)))

对于早期版本,应该这样做:

select
    CONVERT(varchar(10),DATEDIFF(second,@firstDate,@secondDate)/86400)
        + ' days ' +
    CONVERT(varchar(10),
        DATEADD(second,DATEDIFF(second,@firstDate,@secondDate)%86400,0),108)

答案 1 :(得分:0)

尝试这可能会有所帮助:

If OBJECT_ID('UFN_HourMinuteSecond') Is Not Null
Drop Function dbo.UFN_HourMinuteSecond
Go
Exec(
'Create Function dbo.UFN_HourMinuteSecond
(
@StartDateTime DateTime,
@EndDateTime DateTime
) Returns Varchar(10) 
As
Begin

Declare @Seconds Int,
@Minute Int,
@Hour Int,
@Elapsed Varchar(10)

Select @Seconds = ABS(DateDiff(SECOND ,@StartDateTime,@EndDateTime))

If @Seconds >= 60 
Begin
select @Minute = @Seconds/60
select @Seconds = @Seconds%60

If @Minute >= 60
begin
select @hour = @Minute/60
select @Minute = @Minute%60
end

Else
Goto Final 
End

Final:
Select @Hour = Isnull(@Hour,0), @Minute = IsNull(@Minute,0), @Seconds =               IsNull(@Seconds,0)
select @Elapsed = Cast(@Hour as Varchar) + '':'' + Cast(@Minute as Varchar) + '':'' +     Cast(@Seconds as Varchar)

Return (@Elapsed)
End'
)