2

我有一个使用 SQL 的 DateDiff 函数的查询。间隔根据我的说法返回分钟、小时或天。我想返回一个 Datetime 数据类型,而不是返回的结果整数类型。我尝试将其转换如下。

 DATEDIFF(cast(MIN as datetime), b.FollowUpTime, a.FollowUpTime) 

这将返回一个错误。我也试过

DATEDIFF(Convert(datetime,convert(char(8),MiNUTE)), b.FollowUpTime, a.FollowUpTime)

它还返回错误的参数错误。任何帮助,将不胜感激 。谢谢

4

2 回答 2

1

您可以使用它来查找两个日期之间的差异:

SELECT 
    convert(VARCHAR, abs(datediff(second, @date1, @date2) / 60 / 60 / 24)) 
    + ':' + 
    convert(VARCHAR, abs(((datediff(second, @date1, @date2) / 60) / 60) % 24)) 
    + ':' + 
    convert(VARCHAR, abs((datediff(second, @date1, @date2) / 60) % 60)) 
    + ':' + 
    convert(VARCHAR, abs((datediff(second, @date1, @date2) % 60)))

您只需要更改@date1and@date2与您需要的日期。

这是一个SQLFiddle,您可以在其中进行测试

如果您真的想转换为 datetime,请使用:

SELECT 
    convert(DATETIME, 
        (convert(VARCHAR, abs(((datediff(second, @date1, @date2) / 60) / 60) % 24)) 
         + ':' + 
        convert(VARCHAR, abs((datediff(second, @date1, @date2) / 60) % 60)) 
         + ':' + 
        convert(VARCHAR, abs((datediff(second, @date1, @date2) % 60)))
           ) 
   + dateadd(day, 
             abs(datediff(second, @date1, @date2) / 60 / 60 / 24), 
             '01-01-1900 00:00:00')
             )

这是第二个查询的 SQLFiddle

于 2013-08-21T11:18:48.150 回答
0

正如评论中指出的那样,DATEDIFF返回INT两个日期的差值。

由于DATETIME基于 1900-01-01 是“基准日期”,这意味着将 0 分配给 aDATETIME将产生值 1900-01-01,因此您可以将日期差添加到其中并获得相对于该时间点的值( 1900-01-01)。

这是一个例子:

DECLARE @date1 DATETIME = GETUTCDATE()
DECLARE @date2 DATETIME = DATEADD(DAY, -1, GETUTCDATE())

DECLARE @zeroDate DATETIME = 0

SELECT DATEADD(SECOND, DATEDIFF(SECOND, @date1, @date2), @zeroDate)

我还设置了一个SQLFiddle,您可以在其中尝试一下。

于 2013-08-21T11:18:47.760 回答