2017-12-17 13 views
0

「日付と時刻」フィールドに「2017-12-04 21:30:00.000」のような日付エントリがあり、期間が「1800」で「2017-12-04 21:30:22.000」に'22'とすると、クエリのレコードは '2017-12-04 21:30:00.000'と '1800'で表示されますが、22秒間は '2017-12-04 21:30:00.000'になります。 2017-12-04 21:00:00.000、継続時間は '1822'(合計1800 + 22)です。私はこの質問を別の方法でこれlinkですが、私は適切な方法で変更することはできませんので、ここでこの質問をして適切な答えを得ていない。日付と時刻フィールドのクエリ

問合せ:

SELECT Interval=(CASE WHEN datepart(MINUTE,[DateTime]) = 0 and datepart(SECOND,DateTime)=0 THEN 
CAST(CONVERT(VARCHAR(30),DATEADD(HOUR,-1,[DateTime]),101) + ' '+ cast(format(DATEPART(HOUR,DATEADD(HOUR,-1,[DateTime])),'0#') as varchar)+':30:00' as DateTime) 
ELSE (CAST(CONVERT(VARCHAR(30),[DateTime],101) +' ' + (case when datepart(MINUTE,[DateTime])<=30 and 
datepart(SECOND,[DateTime])<59 
then cast(format(DATEPART(HOUR,[DateTime]),'0#') as varchar)+':00:00' 
     else cast(format(DATEPART(HOUR,[DateTime]),'0#') as varchar)+':30:00' end) as DateTime)) END), 
     ID,Code,Duration=SUM(Duration) FROM Table 
     WHERE [DateTime] >= '2017-12-04 00:00:00' and [DateTime] <= '2017-12-04 23:59:59' 

     GROUP BY (CASE WHEN datepart(MINUTE,[DateTime]) = 0 and datepart(SECOND,DateTime)=0 THEN 
CAST(CONVERT(VARCHAR(30),DATEADD(HOUR,-1,[DateTime]),101) + ' '+ cast(format(DATEPART(HOUR,DATEADD(HOUR,-1,[DateTime])),'0#') as varchar)+':30:00' as DateTime) 
ELSE (CAST(CONVERT(VARCHAR(30),[DateTime],101) +' ' + (case when datepart(MINUTE,[DateTime])<=30 and 
datepart(SECOND,[DateTime])<59 then cast(format(DATEPART(HOUR,[DateTime]),'0#') as varchar)+':00:00' 
     else cast(format(DATEPART(HOUR,[DateTime]),'0#') as varchar)+':30:00' end) as DateTime)) END), 

     ID,Code 
     Order by Interval 

実際のテーブルデータ。

DateTime    ID Code Duration 
2017-12-12 00:30:00 1 12  1800 
2017-12-12 00:30:37 1 12  37 
2017-12-12 01:00:00 1 12  1793 
2017-12-12 01:30:00 1 12  1800 
2017-12-12 01:30:59 1 12  59 

私は、クエリを実行した場合、期待される結果は、あなたが30分間隔に[日時]丸める日付関数を使用できますが、結果はあなたの期待される結果と一致していない、これは、

DateTime    ID Code Duration 
2017-12-12 00:00:00 1 12  1837 
2017-12-12 00:30:00 1 12  1800 
2017-12-12 01:00:00 1 12  1800 
2017-12-12 01:30:00 1 12  59 

DateTime    ID Code Duration 
2017-12-12 00:00:00 1 12  1800 
2017-12-12 00:30:00 1 12  1800 
2017-12-12 01:00:00 1 12  1800 
2017-12-12 01:30:00 1 12  59 
+1

これは、言葉の壁にありそうですが、私本当にあなたがここで何をしているのかを翻訳するのに苦労しています。私はあなたの質問を投稿しても、私たちがそれを実行するものがないときは、私たちに多くのことを教えてくれるのではないかと心配しています。おそらくDDL、サンプルデータ、期待される結果セットを投稿するほうがよいでしょう。 – Larnu

+0

@Larnu期待される結果セットを持つサンプルデータをいくつか追加しました。これ以上必要なことがあればお知らせください。 –

+0

2つのデータセット? OK。私はあなたがそれらの結果セットにいかに得るかの韻や理由を見ることができません。異なる論理があるようです。たとえば、私はあなたの最後の行が存在しないことを期待し、前の行は最初の行の論理に基づいて1859の持続時間を持つことを期待しています。あなたの説明は、私は恐れている、全く明確ではない。あなたはあなたが働いていることを述べているようですが、理由や方法は言いません。最初の投稿から2つのデータセットを作成する背景にあるロジックを説明しながら、あなたの投稿を編集することができますか? – Larnu

答えて

0

です間違っているように見える

DateTime    ID Code Duration 
2017-12-12 00:30:00 1 12  1800  1800 + 337 = 1837 2017-12-12 00:30 
2017-12-12 00:30:37 1 12  37 

2017-12-12 01:00:00 1 12  1793     1793 2017-12-12 01:00 

2017-12-12 01:30:00 1 12  1800  1800 + 59 = 1859 2017-12-12 01:30  
2017-12-12 01:30:59 1 12  59 

SQL Fiddle

MS SQL Serverの2014スキーマのセットアップ

CREATE TABLE Table1 
    ([DateTime] datetime, [ID] int, [Code] int, [Duration] int) 
; 

INSERT INTO Table1 
    ([DateTime], [ID], [Code], [Duration]) 
VALUES 
    ('2017-12-12 00:30:00', 1, 12, 1800), 
    ('2017-12-12 00:30:37', 1, 12, 37), 
    ('2017-12-12 01:00:00', 1, 12, 1793), 
    ('2017-12-12 01:30:00', 1, 12, 1800), 
    ('2017-12-12 01:30:59', 1, 12, 59) 
; 

は、クエリ1

select 
    dateadd(minute, (datediff(minute, [DateTime], 0)/30) * 30, 0) 
    , sum(duration) 
from table1 
group by 
    dateadd(minute, (datediff(minute, [DateTime], 0)/30) * 30, 0) 

Results

|      |  | 
|----------------------|------| 
| 1782-01-19T22:30:00Z | 1859 | 
| 1782-01-19T23:00:00Z | 1793 | 
| 1782-01-19T23:30:00Z | 1837 | 
関連する問題