2012-03-19 4 views
2

データを設定します:
ここにあるサンプルテーブル(テーブルA)のデータSQLクエリは

 
ID StartTime    EndTime 
1 2012-03-22 06:00:00.000  2012-03-22 06:30:00.000 
2 2012-03-22 06:15:00.000  2012-03-22 06:45:00.000 
3 2012-03-22 06:30:00.000  2012-03-22 07:00:00.000 
4 2012-03-22 06:45:00.000  2012-03-22 07:15:00.000 
5 2012-03-22 07:00:00.000  2012-03-22 07:30:00.000 
6 2012-03-22 07:15:00.000  2012-03-22 07:45:00.000 
8 2012-03-22 07:30:00.000  2012-03-22 08:00:00.000 
9 2012-03-22 07:45:00.000  2012-03-22 08:15:00.000 
10 2012-03-22 08:00:00.000  2012-03-22 08:30:00.000 
11 2012-03-22 08:15:00.000  2012-03-22 08:45:00.000 
12 2012-03-22 08:30:00.000  2012-03-22 09:00:00.000 
13 2012-03-22 08:45:00.000  2012-03-22 09:15:00.000 
14 2012-03-22 09:00:00.000  2012-03-22 09:30:00.000 
15 2012-03-22 09:15:00.000  2012-03-22 09:45:00.000 
16 2012-03-22 09:30:00.000  2012-03-22 10:00:00.000 

要件:
は、与えられた時間帯のための連続した時間のセットを取得します。例えば時間帯:06:00 8時00分に

予想される出力:

 
ID StartTime    EndTime 
1 2012-03-22 06:00:00.000  2012-03-22 06:30:00.000 
3 2012-03-22 06:30:00.000  2012-03-22 07:00:00.000 
5 2012-03-22 07:00:00.000  2012-03-22 07:30:00.000 
8 2012-03-22 07:30:00.000  2012-03-22 08:00:00.000 

質問:
は、SQLクエリを使用して、予想される出力を取得することが可能ですか?私はループを使いたくない。

私はこれを思いつきましたが、最初の不連続な行のみをフィルタリングします。

SELECT * 
FROM TableA TableA_OUTER (nolock) 
WHERE CONVERT(VARCHAR(5),EndTime,114) <= CONVERT(VARCHAR(5),CAST('08:00' AS DATETIME),114) 
AND (CONVERT(VARCHAR(5),StartTime,114) = CONVERT(VARCHAR(5),CAST('06:00' AS DATETIME),114) OR EXISTS 
(SELECT NULL from TableA TableA_INNER (nolock) 
where CONVERT(VARCHAR(5),TableA_OUTER.StartTime,114) = CONVERT(VARCHAR(5),TableA_INNER.EndTime,114) 
)) 


本当にあなたの助けに感謝!

+0

なぜべきではないクエリのリターンレコード2、4、6を試してみてください? – GolfWolf

+0

ありがとうございます。 StarTimeは最初のレコード選択のキーです.2つの開始時間は6:15です。私の入力は6:00です。 – user1279484

答えて

0

この

-- Create table 

CREATE TABLE [dbo].[TableA](
    [ID] [int] NULL, 
    [StartTime] [datetime] NULL, 
    [EndTime] [datetime] NULL 
) ON [PRIMARY] 

GO 

--insert sample data 
Insert Into TableA (ID,StartTime,EndTime) values(1 ,'2012-03-22 06:00:00.000',  '2012-03-22 06:30:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(2 ,'2012-03-22 06:15:00.000',  '2012-03-22 06:45:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(3 ,'2012-03-22 06:30:00.000',  '2012-03-22 07:00:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(4 ,'2012-03-22 06:45:00.000',  '2012-03-22 07:15:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(5 ,'2012-03-22 07:00:00.000',  '2012-03-22 07:30:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(6 ,'2012-03-22 07:15:00.000',  '2012-03-22 07:45:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(8 ,'2012-03-22 07:30:00.000',  '2012-03-22 08:00:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(9 ,'2012-03-22 07:45:00.000',  '2012-03-22 08:15:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(10 ,'2012-03-22 08:00:00.000',  '2012-03-22 08:30:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(11 ,'2012-03-22 08:15:00.000',  '2012-03-22 08:45:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(12 ,'2012-03-22 08:30:00.000',  '2012-03-22 09:00:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(13 ,'2012-03-22 08:45:00.000',  '2012-03-22 09:15:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(14 ,'2012-03-22 09:00:00.000',  '2012-03-22 09:30:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(15 ,'2012-03-22 09:15:00.000',  '2012-03-22 09:45:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(16 ,'2012-03-22 09:30:00.000',  '2012-03-22 10:00:00.000') 

--query 

Declare @AnchorElement int 
Set @AnchorElement = (Select top 1 ID from TableA 
where '2012-03-22 06:00:00.000' 
between StartTime and EndTime 
Order by StartTime 
) 
; 


With ListStartingAtDate (ID, StartTime, EndTime ,Level) as 
    (
     -- Anchor Timeframe definition 
     select ID, StartTime, EndTime , 0 as Level From TableA 
      --Where ID = @AnchorElement 
      -- StartTime has to be matched exactly 
      WHERE StartTime = '2012-03-22 06:00:00.000' 
     UNION ALL 
     -- Recursive Timeframe definition 
     select a.ID, a.StartTime, a.EndTime , Level +1 
     From TableA a 
     INNER JOIN ListStartingAtDate b 
     ON a.StartTime = b.EndTime 

    ) 

    select * from ListStartingAtDate 
    where StartTime >= '2012-03-22 06:00:00.000' and EndTime <= '2012-03-22 08:00:00.000' 
+0

@MalcomFrexner:これを書こうとしていただきありがとうございます。これは間違いなく正しい入力値が期待されている結果を示しています。入力開始時刻または終了時刻がテーブルにない場合は行を表示できませんか?例えば、 starttimeが6:10と指定されても、6:30以降の行はまだ表示されます。エンドタイムと同じ問題。私にお知らせください。再度、感謝します。 – user1279484

+0

開始時刻に合わせてクエリを変更しました。私はまだエンドタイムについて考える必要があります。あまりにもエレガントなsolutiobn(最終日の結果表を見ているようなもの) –

+0

私はendtimeが一致するときだけあなたのクエリを実行すると私の問題を解決する必要があります。 – user1279484