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

以下はSQLServerで機能しますが、他のデータベースは日付の計算と現在の時刻の取得にさまざまな関数を使用します。

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

--miを数分間使用してdatediffで遊ぶことができます

-これにより、各タスクの2番目が得られます

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のほとんどのバリエーションでは、日付に対して簡単に計算を実行できます。これが日付フィールドであると仮定すると、おそらく次のクエリを実行できます。

期間の選択=停止-開始

実際の例として、テーブルを気にせずに2つの日時の違いを選択してみましょう。

select convert(datetime、 '2008-09-17 04:56:45.030')-convert(datetime、 '2008-09-17 04:53:05.920')

これは「1900-01-0100:03:39.110」を返し、年/月/日がゼロであることを示します。3分、これら2つの日時の間の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 に答える
0

datediff 関数は、経過分を表示できます。12/31/9999 チェックの if ステートメントは、読者の演習として残しておきます ;-)

于 2008-09-17T10:44:07.390 に答える