5

DateDiffの形式(hh.mm)のようなSQLテーブルがあります

DateDiff   ATM
1.45       121
1.50       121
1.50       121

ATMSumでDateDiffを実行すると、次のような結果が表示されますGroup by

4.45    121

ただし、実際の日時の差は次のようになります。

5.25     121

SQLクエリで同じことをどのように達成できますか

Select Sum(Cast(Convert(Varchar(10),DATEDIFF(HOUR,TicketRaisedOn,ClosedOn))+'.'+
Convert(Varchar(10),DATEDIFF(MINUTE,TicketRaisedOn,ClosedOn)%60) as Numeric(18,2)))[Down Time],ATM 
From Ticket Where Closed=1 And DATEPART(DAYOFYEAR,GETDATE())=DATEPART(DAYOFYEAR,TicketRaisedOn) 
Group BY ATM Order By [Down Time] Desc

TicketRaisedOnClosedOnはDateTimeです

データベースはSQLServer2008です

上記のクエリは、このような結果を出力します(ただし、日時形式ではなく数値として合計されるため、間違っています)

Down Time       ATM
16.95           282
14.46           1811
14.20           52
14.04           936

サンプルデータ

Select TicketRaisedOn,ClosedOn,ATM 
From Ticket 
Where ATM=282 And DATEPART(DAYOFYEAR,GETDATE())=DATEPART(DAYOFYEAR,TicketRaisedOn) 
And Closed=1

TicketRaisedOn          ClosedOn                ATM
2012-12-21 01:15:23.793 2012-12-21 15:11:59.240 282
2012-12-21 16:42:29.820 2012-12-21 18:21:30.797 282
4

2 に答える 2

4

フォーマットする前に合計を行います

SELECT
  ATM,
  CONVERT(VARCHAR(10), SUM(DATEDIFF(Minute, TicketRaisedOn, ClosedOn)) / 60)
  + '.' +
  RIGHT('00' + CONVERT(VARCHAR(2), SUM(DATEDIFF(Minute, TicketRaisedOn, ClosedOn)) % 60), 2)
FROM Ticket
GROUP BY ATM

SQLフィドル:http ://sqlfiddle.com/#!3 / eca01 / 1

于 2012-12-21T14:08:35.847 に答える
3

1.5は1時間50分ではなく、1時間半を表すため、実行していることは機能しません。

必要なものを取得するには、秒などの小さな単位で算術演算を実行し、これを日時に変換してから、日時を最終的な表現に変換します。次に例を示します。

select right(convert(varchar(255),
                     DATEADD(second, DATEDIFF(s, TicketRaisedOn,ClosedOn), cast(0 as datetime)),
                     120),
             8)
于 2012-12-21T14:00:22.007 に答える