我的数据库中有一个表,用于记录特定任务的开始和停止时间。以下是数据样本:
Start Stop
9/15/2008 5:59:46 PM 9/15/2008 6:26:28 PM
9/15/2008 6:30:45 PM 9/15/2008 6:40:49 PM
9/16/2008 8:30:45 PM 9/15/2008 9:20:29 PM
9/16/2008 12:30:45 PM 12/31/9999 12:00:00 AM
我想编写一个总计这些时间框架已用时间的脚本,并且只要有12/31/9999日期,我希望它使用当前日期和时间,因为这仍在进行中
如何使用Transact-SQL执行此操作?
答案 0 :(得分:11)
SELECT SUM( CASE WHEN Stop = '31 dec 9999'
THEN DateDiff(mi, Start, Stop)
ELSE DateDiff(mi, Start, GetDate())
END ) AS TotalMinutes
FROM task
然而,更好的解决方案是制作Stop field nullable, and make it null when the task is still running. That way, you could do this:
SELECT SUM( DateDiff( mi, Start, IsNull(Stop, GetDate() ) ) AS TotalMinutes
FROM task
答案 1 :(得分:3)
我认为这更清洁:
SELECT SUM(
DATEDIFF(mi, Start, ISNULL(NULLIF(Stop,'99991231'), GetDate()))
) AS ElapsedTime
FROM Table
答案 2 :(得分:2)
尝试:
Select Sum(
DateDiff(
Minute,
IsNull((Select Start where Start != '9999.12.31'), GetDate()),
IsNull((Select End where End != '9999.12.31'), GetDate())
)
)
from *tableName*
答案 3 :(得分:1)
以下内容适用于SQL Server,其他数据库使用不同的函数进行日期计算并获取当前时间。
Select Case When (Stop <> '31 Dec 9999') Then
DateDiff(mi, Start, Stop)
Else
DateDiff(mi, Start, GetDate())
End
From ATable
答案 4 :(得分:0)
datediff function可以显示已用时间。 12/31/9999检查的if语句我将留给读者作为练习; - )
答案 5 :(得分:0)
- 你可以使用mi玩几分钟
- 这给你每个任务的第二个
select Start,
Stop,
CASE
WHEN Stop = '9999-12-31' THEN datediff(ss, start,getdate())
ELSE datediff(ss, start,stop)
END duration_in_seconds
from mytable
- 总和
Select Sum(duration_in_seconds)
from
(
select Start,
Stop,
CASE
WHEN Stop = '9999-12-31' THEN datediff(ss, start,getdate())
ELSE datediff(ss, start,stop)
END duration_in_seconds
from mytable)x
答案 6 :(得分:0)
Datediff变得更难以使用,因为你的差异中有更多的日期部分(例如,在你的情况下,看起来像分钟和秒;偶尔是几小时)。幸运的是,在TSQL的大多数变体中,您只需在日期上执行数学运算即可。假设这是一个日期字段,您可以只查询:
选择持续时间=停止 - 开始
对于一个实际的例子,让我们选择两个日期时间之间的差异而不用打扰一个表:
选择转换(datetime,'2008-09-17 04:56:45.030') - 转换(datetime,'2008-09-17 04:53:05.920')
返回“1900-01-01 00:03:39.110”,表示零年/月/日;这两个日期之间3分钟,39.11秒。从那里,你的代码可以TimeSpan.Parse这个值。
答案 7 :(得分:0)