2016-03-20 17 views
1

私はいくつかのデータで毎秒更新されるテーブルを持っています。私は、ユーザーが開始日と終了日、開始時刻と終了時刻を入力し、データが必要な間隔を選択できるフォームを設計しました。たとえば、今日のレコードを両方のテキストボックスに入力し、1時間10分10秒を入力する必要がある場合は、その日のデータ(24時間)を1時間ごとに取得する必要があります。時間、分、秒のユーザー入力に基づいてレコードを取得するSQLクエリを変更する方法

私はユーザーの入力に基づいて動的にクエリを構築しています。

最初のクエリ、ユーザーが "1時間10分10秒"

を選択し、ユーザーの後
WITH CTE AS (SELECT *,RN=ROW_NUMBER() OVER(
             PARTITION BY DATEDIFF(MINUTE, 0, cdt)/10 ORDER BY cdt DESC) from brands) 
    SELECT t0.brandID, t0.brandName, t0.cdt, t0.udt, t0.brandstatus, t0.AddedBy 
     FROM cte t0 WHERE RN=1 AND (t0.cdt >= '2013-11-01' and t0.cdt <='2013-11-16') 

を "1時間10分10秒"

SELECT t0.brandID, t0.brandName, t0.cdt, t0.udt, t0.brandstatus, t0.AddedBy 
FROM brands t0 WHERE t0.cdt >= @VALUE1 and t0.cdt <[email protected] 

に入る前に、上記のクエリは10で私を与えています"分" 間隔どのように時間のためにそれを変更するには、分、秒

brandid  brandname   cdt     udt      brandstatus  addedby 
1    something 2013-11-01 00:00:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 00:01:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 00:02:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 00:03:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 00:04:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 00:05:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 00:06:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 00:07:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 00:08:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 00:09:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 00:10:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 01:01:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 00:02:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 00:03:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 00:30:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 02:10:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 03:00:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 03:01:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 03:02:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 03:03:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 03:15:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 03:20:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 04:10:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 05:10:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 06:21:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 07:51:01.123 2013-11-01 00:00:01.123  1    1 
1    something 2013-11-01 08:01:01.123 2013-11-01 00:00:01.123  1    1 

enter image description here

期待される結果は、1時間1分1秒

1    something 2013-11-01 01:01:01.123 2013-11-01 00:00:01.123  1    1 

1    something 2013-11-01 01:30:01.123 2013-11-01 00:00:01.123  1    1 

1    something 2013-11-01 02:10:01.123 2013-11-01 00:00:01.123  1    1 

1    something 2013-11-01 03:20:01.123 2013-11-01 00:00:01.123  1    1 
+0

あなたの質問は何ですか?あなたはあなたの要求結果を正しく得ているようですか? –

+0

ええ、私はわずかな間隔で取得しています。画像が表示されている場合は、すべてのオプションを生成します。ユーザーが分を入力すると結果が表示され、ユーザーが時間や秒を入力すると結果は表示されません。ユーザーが1時間5分30秒を入力すると、1時間ごとにデータをロードする必要があります。5分30秒 – Tan

+0

現時点で理解するのは少し難しいですが、サンプルデータと期待される結果を提供できますか? – AKS

答えて

1

ために、あなたの他のthread DATEDIFFに示すように)(間隔でグループをあろう取得の基本原理は、整数を返します。整数で除算すると整数になります。したがって

10/10 = 1 
11/10 = 1 
. . . 
19/10 = 1 

これをパーティションにすると、10分の間隔が求められます。問題は秒であるので、

あなたのような間隔1時間5分を必要とする場合、分に変換は65分

であり、これはあなたに1時間5分

PARTITION BY DATEDIFF(MINUTE, 0, cdt)/65 

の間隔を与えます。間隔が秒単位で必要な場合は、オーバーフローの原因となるDATEDIFF (SECOND, 0, cdt)を使用する必要があります。

開始日が@VALUE1の良いことです。だから、基準日として、代わりの日0

PARTITION BY DATEDIFF(SECOND, @VALUE1, cdt) 

だから一緒にすべてを入れて、秒に

それを行う必要があります
declare @interval int 

select @interval = (1 * 60 * 60) + (5 * 60) + (10) 

PARTITION BY DATEDIFF(SECOND, @VALUE1, cdt)/@interval 

を1時間5分10秒の必要な間隔を変換することを使用することができます

関連する問題