当时间跨越午夜时,Datediff

问题描述 投票:0回答:3

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

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

sql-server sql-server-2008
3个回答
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
投票

假设begin_work = 20:00:00 假设end_work = 06:00:00 答案= 08:00:00

选择 *, 案件 当end_work> begin_work时 那么timediff(end_work,begin_work) ELSE addtime(timediff('24:00:00',begin_work),end_work) END AS elapsed_time 来自my_table

限制 - 这仅适用于不超过23小时59分59秒的持续时间。如果持续时间超过24小时,我建议使用DATEDIFF

希望这可以帮助, 麦克风


0
投票

您看到的问题是由于datediff函数查看值:

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

© www.soinside.com 2019 - 2024. All rights reserved.