0

DATETIME私は2つの列を持つテーブルを持っています:

Column1              Column2
1/1/1900 12:20:45    1/1/1900 23:22:25
1/1/1900 09:00:00    1/1/1900 18:10:30
…                    …

(時刻は の形式ですHH:MM:SS。)

列 1 の合計と列 2 の合計を取得したいと考えています。テーブルに上記の 2 つの行しかない場合、予想される結果は次のようになります。

Column1              Column2 
1/1/1900 21:20:45    1/1/1900 41:32:55

時間、分、および秒が 60 を超えてはならないことに注意してください。

SQL Server 2000 でこれらの列を合計するにはどうすればよいですか?

4

7 に答える 7

0
select Column1+Column2 from table
于 2009-09-30T13:24:08.183 に答える
0
SELECT Column1 + Column2 AS MyResult FROM YOURTABLE
于 2009-09-30T13:25:29.040 に答える
0

このサンプルは、あなたがする必要があることを説明するはずです:

declare @Base datetime set @base = '1900-01-01'
declare @first datetime set @first = '1900-01-01 12:15:00'
declare @other datetime set @other = '1900-01-01 01:00:00'

select DATEADD(s, SUM(DATEDIFF(s, @base, dt)),@base)
from 
(
    select @first as dt
    union select @other 
) t

SqlServer2000ボックスのQAからの出力は次のとおりです。

1900-01-01 13:15:00.000

于 2009-09-30T13:26:01.507 に答える
0

これはあなたが求めているものをあなたに与えるでしょう:

CREATE TABLE #Times
(
     Column1 datetime
    ,Column2 datetime
)

INSERT INTO #Times VALUES ('1/1/1900 12:20:45',    '1/1/1900 23:22:25')
INSERT INTO #Times VALUES ('1/1/1900 09:00:00',    '1/1/1900 18:10:30')

SELECT
     CONVERT(varchar(10),dateadd(day,datediff(day,0,dt2.MinColumn1),0),101)
         +' '
         +CASE WHEN TotalSecondsColumn1/3600>60 then '60' ELSE CONVERT(varchar(2),TotalSecondsColumn1/3600) END
         +':'
         +CASE WHEN (TotalSecondsColumn1-(TotalSecondsColumn1/3600*3600))/60 >60 then '60' ELSE CONVERT(varchar(2),(TotalSecondsColumn1-(TotalSecondsColumn1/3600*3600))/60) END
         +':'
         +CASE WHEN TotalSecondsColumn1-((TotalSecondsColumn1/3600*3600)+(((TotalSecondsColumn1-(TotalSecondsColumn1/3600*3600))/60)*60)) >60 then '60' ELSE CONVERT(varchar(2),TotalSecondsColumn1-((TotalSecondsColumn1/3600*3600)+(((TotalSecondsColumn1-(TotalSecondsColumn1/3600*3600))/60)*60))) END
     AS Column1
    ,CONVERT(varchar(10),dateadd(day,datediff(day,0,dt2.MinColumn2),0),101)
         +' '
         +CASE WHEN TotalSecondsColumn2/3600>60 then '60' ELSE CONVERT(varchar(2),TotalSecondsColumn2/3600) END
         +':'
         +CASE WHEN (TotalSecondsColumn2-(TotalSecondsColumn2/3600*3600))/60 >60 then '60' ELSE CONVERT(varchar(2),(TotalSecondsColumn2-(TotalSecondsColumn2/3600*3600))/60) END
         +':'
         +CASE WHEN TotalSecondsColumn2-((TotalSecondsColumn2/3600*3600)+(((TotalSecondsColumn2-(TotalSecondsColumn2/3600*3600))/60)*60)) >60 then '60' ELSE CONVERT(varchar(2),TotalSecondsColumn2-((TotalSecondsColumn2/3600*3600)+(((TotalSecondsColumn2-(TotalSecondsColumn2/3600*3600))/60)*60))) END
     AS Column1
    FROM #Times t
        INNER JOIN (SELECT
                         SUM(DATEDIFF(second,CONVERT(datetime,LEFT(CONVERT(char(23),Column1,121),10)),Column1)) AS TotalSecondsColumn1
                        ,SUM(DATEDIFF(second,CONVERT(datetime,LEFT(CONVERT(char(23),Column2,121),10)),Column2)) AS TotalSecondsColumn2
                        FROM #Times
                   ) dt ON 1=1
        INNER JOIN (SELECT
                         MIN(Column1) AS MinColumn1
                        ,MIN(Column2) AS MinColumn2
                        FROM #Times
                   ) dt2 ON 1=1
    WHERE t.Column1=dt2.MinColumn1

出力:

Column1             Column1
------------------- -------------------
01/01/1900 21:20:45 01/01/1900 41:32:55

(1 row(s) affected)

ただし、これにより、時刻が正確に合計され、日、月、および年も増分されます。

SELECT
     DATEADD(second,dt.TotalSecondsColumn1,dateadd(day,datediff(day,0,dt2.MinColumn1),0)) AS Column1
    ,DATEADD(second,dt.TotalSecondsColumn2,dateadd(day,datediff(day,0,dt2.MinColumn2),0)) AS Column2
    FROM #Times t
        INNER JOIN (SELECT
                         SUM(DATEDIFF(second,CONVERT(datetime,LEFT(CONVERT(char(23),Column1,121),10)),Column1)) AS TotalSecondsColumn1
                        ,SUM(DATEDIFF(second,CONVERT(datetime,LEFT(CONVERT(char(23),Column2,121),10)),Column2)) AS TotalSecondsColumn2
                        FROM #Times
                   ) dt ON 1=1
        INNER JOIN (SELECT
                         MIN(Column1) AS MinColumn1
                        ,MIN(Column2) AS MinColumn2
                        FROM #Times
                   ) dt2 ON 1=1
    WHERE t.Column1=dt2.MinColumn1

出力:

Column1                 Column2
----------------------- -----------------------
1900-01-01 21:20:45.000 1900-01-02 17:32:55.000

(1 row(s) affected)
于 2009-09-30T19:00:50.617 に答える
0

期待される出力 column1 column2 1/1/1900 21:20:45 1/1/1900 41:32:55

SQL Server 2000 の DATETIME は 24 時間に制限されているため、これは機能しません。

したがって、時間を合計するには、INT列として時間、分、秒に分割してから、次のようにする必要があると思います

UPDATE dbo.YourTable
SET SumHours = DATEPART(HOUR, CONVERT(DATETIME, Column1, 100)),
    SumMinutes = DATEPART(MINUTE, CONVERT(DATETIME, Column1, 100)),
    SumSeconds = DATEPART(SECOND, CONVERT(DATETIME, Column1, 100))
WHERE........

(column2 についても同様です)。

他の方法は本当にわかりません。また、分 > 60 を時 + 分に、秒 > 60 を分 + 秒に変換するのはあなた次第です。

マルク

于 2009-09-30T13:55:26.130 に答える
0
SELECT DATEADD(s, 0, SUM(DATEDIFF(s, 0, Column1))) AS SUMColumn1
    ,DATEADD(s, 0, SUM(DATEDIFF(s, 0, Column2))) AS SUMColumn2
FROM tbl
于 2009-09-30T14:39:27.647 に答える
0

私の仮定:あなたの日時は経過時間を追跡しています。たとえば、最初の値「1/1/1900 12:20:45」は、その間に 12 時間 20 分 45 秒が経過したことを意味します。それを考慮して、これらすべての経過時間を合計して、「合計経過時間」を生成します。

これを行う1つの方法を次に示します。(他にもあるかもしれません。時間計算を実装するためのより良い方法が常にあるようです。) 例をより明確にし、適切に偏執的になるために、1 つの列だけをクエリしています。さらに、日付部分は(a)完全に無関係であり、(b)何にでも設定できると想定しています。[もちろん、SQL 2008 を使用している場合は、Time データ型の列を設定する必要があります。] 最後の列 [5] が目的の列です。他の人は、私がそこにたどり着いた方法を説明します。

select
   MyColumn  --  [1]
  ,dateadd(dd, -datediff(dd, 0, MyColumn), MyColumn)  --  [2]
  ,datediff(ss, 0, dateadd(dd, -datediff(dd, 0, MyColumn), MyColumn))  --  [3]
 from MyTable

select
   sum(datediff(ss, 0, dateadd(dd, -datediff(dd, 0, MyColumn), MyColumn)))  --  [4]
  ,dateadd(ss, sum(datediff(ss, 0, dateadd(dd, -datediff(dd, 0, MyColumn), MyColumn))), 0)  --  [5]
 from MyTable

[1] は各行の初期値を示します。
[2] は、すべての列の日付部分を「1900 年 1 月 1 日」に変換します。日付が常に同じであることが確実な場合は、これを考慮する必要はありません。
[3] これは、午前 0 時から記録された時間までの経過秒数を計算します。
[4] これは秒を合計します。
[5] これにより、経過時間 (秒単位) が「1900 年 1 月 1 日」に追加されます。

そこから、結果を経過時間として表示するために使用する標準的な書式設定手法を使用します (経過時間は 24 時間を超える場合があるため、日付を考慮することを忘れないでください)。この手法は、任意の時間単位に対して正確です (ここでは、必要に応じて秒を使用しました)。 bigint にキャストする必要がある場合があります。

うーん、ちょっと考えてみた: 1 回の経過時間が 24 時間よりも長い場合はどうなるのだろうか? その場合、日時の日付は重要であり、「開始日」を表す必要があります。さらに悪いことに、すべての経過時間は 24 時間以上になる可能性があるため、サンプル プールの最も早い日付が基準日であると想定することはできません。これを行うには、計算元の「基準日」を決定する何らかの方法が必要です。あなたの質問には、基準日がいつになるかについての指示がないので、最終的な仮定として、これは問題ではないと仮定します。つまり、経過時間はすべて 24 時間未満であるということです。

于 2009-09-30T14:31:14.163 に答える