SQL DateDiff在整夜的几分钟内

时间:2018-12-06 19:58:44

标签: sql sql-server tsql datetime time

尝试获取日期时间字段和时间字段之间的分钟差。我正在使用datediff函数。

当开始时间从某个日期开始,例如“ 2018-01-08 22:35:55.043”,结束时间是第二天,例如“ 00:35:56.2136644”时,结果从结束时间开始计算开始时间。

示例:

select DATEDIFF(MINUTE, CAST('2018-01-08 22:35:55.043' AS TIME), '00:35:56.2136644') AS minDiff1
select DATEDIFF(MINUTE,  '00:35:56.2136644', CAST('2018-01-08 22:35:55.043' AS TIME)) AS minDiff2
select DATEDIFF(MINUTE, CONVERT(TIME, '2018-01-08 22:35:55.043'), '00:35:56.2136644') AS minDiff3
select DATEDIFF(MINUTE, '00:35:56.2136644', CONVERT(TIME, '2018-01-08 22:35:55.043')) AS minDiff4

结果与我的预期不同。理想的结果是120分钟。

minDiff1 = -1320

minDiff2 = 1320

minDiff3 = -1320

minDiff4 = 1320

原始查询

select DATEDIFF(MINUTE, CAST(test_start_datetime as TIME), test_end_time) AS minDiff
from user_exam  

3 个答案:

答案 0 :(得分:1)

以下假设时间属于同一天或第二天:

SELECT *, CASE
    -- same day -- start time is less than end time
    WHEN CAST(datetimecol AS time) <= timecol THEN DATEDIFF(MINUTE, CAST(datetimecol AS time), timecol)
    -- next day -- start time is more than end time (it rolled over into next day)
    ELSE 1440 - DATEDIFF(MINUTE, timecol, CAST(datetimecol AS time))
END
FROM (VALUES
    (CAST('2018-01-08 22:35:55.043' AS DATETIME), CAST('22:35:55.0433333' AS TIME)),
    (CAST('2018-01-08 22:35:55.043' AS DATETIME), CAST('23:35:56.2136644' AS TIME)),
    (CAST('2018-01-08 22:35:55.043' AS DATETIME), CAST('00:35:56.2136644' AS TIME))
) AS tests(datetimecol, timecol)

在上面的示例中1440是24小时内的分钟数。

Demo on DB Fiddle

答案 1 :(得分:0)

让我们首先重新考虑您的示例:

select DATEDIFF(MINUTE, CAST('2018-01-08 22:35:55.043' AS TIME), '00:35:56.2136644') AS minDiff1
select DATEDIFF(MINUTE,  '00:35:56.2136644', CAST('2018-01-08 22:35:55.043' AS TIME)) AS minDiff2
select DATEDIFF(MINUTE, CONVERT(TIME, '2018-01-08 22:35:55.043'), '00:35:56.2136644') AS minDiff3
select DATEDIFF(MINUTE, '00:35:56.2136644', CONVERT(TIME, '2018-01-08 22:35:55.043')) AS minDiff4

从日期时间到时间的转换/广播会将日期部分丢掉。因此,您实际上正在运行:

select DATEDIFF(MINUTE, '22:35:55.043'', '00:35:56.2136644') AS minDiff1
select DATEDIFF(MINUTE,  '00:35:56.2136644', '22:35:55.043') AS minDiff2
select DATEDIFF(MINUTE, '22:35:55.043', '00:35:56.2136644') AS minDiff3
select DATEDIFF(MINUTE, '00:35:56.2136644'22:35:55.043') AS minDiff4

在这一点上,您似乎没有考虑DATEDIFF是有向的,这意味着它从第二个参数到第三个参数都计数(传递的第一个参数单位)。因此,由于00:35比当天的22:35早1320分钟,因此00:35-> 22:35返回1320,而22:35-> 00:35返回-1320。


确切地说,由于DATEDIFF使用日期时间,因此您的时间/时间表示字符串会隐式转换为日期。由于您没有提供日期,因此使用的日期是1900年1月1日的值0:这是函数执行操作的常见日期。

答案 2 :(得分:0)

如果您想看到120,则意味着时差不足以实现您的目的。关于您的问题,您想找到22:35和第二天00:35之间的区别 您需要找到DATETIME之类的差异:

SELECT DATEDIFF(MINUTE,         CAST(GETDATE() AS DATETIME)
                               +CAST(CAST('22:35:55.2136644' AS TIME) AS DATETIME)
                             , 
                                CAST(GETDATE() AS DATETIME)+1
                               +CAST(CAST('00:35:56.2136644' AS TIME)AS DATETIME)

                ) AS minDiff1