【问题标题】:Transact-SQL to sum up elapsed timeTransact-SQL 总结经过的时间
【发布时间】:2010-09-10 01:28:43
【问题描述】:

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

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

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:
    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
    来自任务
    

    【讨论】:

      【解决方案2】:

      我觉得这样更干净:

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

      【讨论】:

        【解决方案3】:

        试试:

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

              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 这个值。

              【讨论】:

                【解决方案7】:

                在 AJ 的 answer、BelowNinety 的 answer 和 Nerdfest 的 answer 的帮助下,我得出了以下结论:

                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
                

                感谢您的帮助!

                【讨论】:

                  【解决方案8】:

                  --你可以用 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
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2020-12-01
                    • 2010-09-08
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-11-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多