尝试获取日期时间字段和时间字段之间的分钟差。我正在使用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
答案 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小时内的分钟数。
答案 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