当时间跨越午夜时,Datediff

时间:2011-12-20 17:41:09

标签: sql-server sql-server-2008

任何想法如何构建计算可能越过午夜的时间的日期查询?

当然,如果是一个案例,我会分别计算部分往返午夜,但我需要通用查询,因为我有数千行,其中有些行跨越午夜,有些不行,而且每一行其中我必须计算。约会(最长10分钟,不能超过2天)。

3 个答案:

答案 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中时间的最小粒度)