任何想法如何构建计算可能越过午夜的时间的日期查询?
当然,如果是一个案例,我会分别计算部分往返午夜,但我需要通用查询,因为我有数千行,其中有些行跨越午夜,有些不行,而且每一行其中我必须计算。约会(最长10分钟,不能超过2天)。
答案 0 :(得分:4)
DATEDIFF函数处理两种情况。
SELECT DATEDIFF(MINUTE, '2011-12-20 11:43:00', '2011-12-20 11:50:00')
SELECT DATEDIFF(MINUTE, '2011-12-20 23:59:00', '2011-12-21 00:07:00')
答案 1 :(得分:1)
假设begin_work = 20:00:00
假设end_work = 06:00:00
答案= 08:00:00
SELECT *,
案例
当end_work> begin_work
THEN timediff(end_work,begin_work)
ELSE addtime(timediff('24:00:00',begin_work),end_work)
END AS elapsed_time
来自my_table
限制-仅在不超过23h 59m 59s的持续时间内起作用。 如果持续时间超过24小时,建议您使用DATEDIFF
希望这会有所帮助,
迈克
答案 2 :(得分:0)
您看到的问题是由于日期值函数查看值:
declare @start datetime = '2000-01-01 23:59:59.997'
declare @end datetime = '2000-01-02 00:00:01.003'
select datediff(mi,@start,@end) [mins], datediff(ss,@start,@end) [secs]
output:
mins secs
1 2
select datediff(ss,@start,@end)/60 [mins], datediff(ms,@start,@end)/1000 [secs]
output:
mins secs
0 1
分钟值确实会发生变化。它包裹从59到00,所以函数正确返回1.为了正确计算经过的时间,我使用秒除以60表示分钟,毫秒除以1000表示秒。这可以防止跨越午夜问题。 (注意:3毫秒是SQL Server中时间的最小粒度)