5

我的数据库中有一个表,记录了特定任务的开始和停止时间。以下是数据示例:

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 执行此操作?

4

8 回答 8

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
于 2008-09-17T13:13:06.563 回答
3

我认为这更清洁:

   SELECT  SUM(
               DATEDIFF(mi, Start, ISNULL(NULLIF(Stop,'99991231'), GetDate()))
              ) AS ElapsedTime
   FROM Table
于 2008-09-25T23:26:39.913 回答
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*
于 2008-09-17T11:06:55.947 回答
1

以下将适用于 SQL Server,其他数据库使用不同的函数进行日期计算和获取当前时间。

Select  Case When (Stop <> '31 Dec 9999') Then 
          DateDiff(mi, Start, Stop) 
        Else 
          DateDiff(mi, Start, GetDate()) 
        End
From    ATable
于 2008-09-17T11:15:34.820 回答
0

datediff 函数可以显示经过的分钟数。9999 年 12 月 31 日检查的 if 语句我将作为练习留给读者 ;-)

于 2008-09-17T10:44:07.390 回答
0

--你可以用 mi 玩 datediff 几分钟

-- 这给了你每个任务的第二个

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
于 2008-09-17T10:55:34.680 回答
0

Datediff 变得更加难以使用,因为您的差异中有更多的日期部分(即在您的情况下,看起来像分钟和秒;偶尔是小时)。幸运的是,在大多数 TSQL 变体中,您可以简单地对日期执行数学运算。假设这是一个日期字段,您可能只需要查询:

选择持续时间 = 停止 - 开始

举一个实际的例子,让我们选择两个日期时间之间的差异,而不用考虑表格:

选择转换(日期时间,'2008-09-17 04:56:45.030') - 转换(日期时间,'2008-09-17 04:53:05.920')

返回“1900-01-01 00:03:39.110”,表示有零年/月/日;这两个日期时间之间 3 分 39.11 秒。从那里,您的代码可以 TimeSpan.Parse 这个值。

于 2008-09-17T10:56:41.120 回答
0

使用 AJ 的回答、BelowNinety 的回答和 Nerdfest 的回答的帮助,我得出以下结论:

Select Sum(
    Case When End = '12/31/9999 12:00:00 AM' Then
         DateDiff(mi, Start, Getdate()) 
    Else 
         DateDiff(mi, Start, End) 
    End) As ElapsedTime 
From Table

谢谢您的帮助!

于 2008-09-17T19:40:05.777 回答