Transact-SQL汇总经过时间

时间:2020-03-05 18:58:32  来源:igfitidea点击:

我的数据库中有一个表,其中记录了特定任务的开始和结束时间。这是数据示例:

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做到这一点?

解决方案

回答

datediff函数可以显示经过的分钟数。 12/31/9999支票的if语句,我将作为练习留给读者;-)

回答

-我们可以使用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

回答

随着日期差异的增加,Datediff会变得更加难以使用(例如,在我们看来,这是分钟和秒,有时是几小时)。幸运的是,在大多数TSQL变体中,我们只需在日期上执行数学运算即可。假设这是一个日期字段,我们可能只需查询:

选择持续时间=停止开始

举一个实际的例子,让我们选择两个日期时间之间的差异,而不必麻烦表:

选择convert(datetime,'2008-09-17 04:56:45.030')convert(datetime,'2008-09-17 04:53:05.920')

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

回答

尝试:

Select Sum(
    DateDiff(
        Minute,
        IsNull((Select Start where Start != '9999.12.31'), GetDate()),
        IsNull((Select End where End != '9999.12.31'), GetDate())
    )
)
from *tableName*

回答

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

Select  Case When (Stop <> '31 Dec 9999') Then 
          DateDiff(mi, Start, Stop) 
        Else 
          DateDiff(mi, Start, GetDate()) 
        End
From    ATable

回答

SELECT  SUM( CASE  WHEN Stop = '31 dec 9999' 
                   THEN DateDiff(mi, Start, Stop)
                   ELSE DateDiff(mi, Start, GetDate())
             END ) AS TotalMinutes 
FROM    task

但是,更好的解决方案是使Stop字段为可空状态,并在任务仍在运行时使其为空。这样,我们可以执行以下操作:

SELECT  SUM( DateDiff( mi, Start, IsNull(Stop, GetDate() ) ) AS TotalMinutes 
FROM    task

回答

利用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

谢谢帮助!

回答

我认为这更干净:

SELECT  SUM(
               DATEDIFF(mi, Start, ISNULL(NULLIF(Stop,'99991231'), GetDate()))
              ) AS ElapsedTime
   FROM Table