2011-12-03 1 views
1

私はTSQLクエリを作成して、予定の一覧から次に利用可能な日時を探します。これまでのところ、私は時間問合せのギャップを見つけましたが、夜間を除外する素晴らしい方法を見つけることはできません(午後7時以降)。夜間をTSQLクエリから除外する方法は?

;WITH CTE 
AS ( SELECT 
     ID,StartAptDate,EndAptDate, 
     RowNumber = ROW_NUMBER() OVER(ORDER BY StartAptDate ASC) 
     FROM Appointments WHERE StylistId = 1 AND StartAptDate > CAST(CONVERT(CHAR(8), GetDate(), 112) AS DATETIME) 
    ) 
    SELECT FirstApptAvail = min(a.EndAptDate) 
    FROM CTE a 
     INNER JOIN CTE b 
     ON a.RowNumber = b.RowNumber - 1 
    WHERE datediff(minute, a.EndAptDate, b.StartAptDate) >= 15 AND ... 

...この

(a.StartAptDate < GETDATE @ 19:00と午前8時 @ a.StartAptDate> GETDATE + 1

ようなものになるだろうのために少しの擬似コード

私が正しく得ることができない部分は、各比較の右側を構築することです。その夜の午後7時から翌朝の午前8時の間に返される可能性のあるものは除外する必要があります。

は、事前に迅速なフィードバックのための

+0

([日付の値] '07:00:00'と'19:00:00 ')は使用できません。 – ComputerSaysNo

+0

優秀!それは私がすでにこれを工夫しているように見えるでしょう:) –

+0

または([DATETIME VALUE] :: time> = '07:00:00 'AND [DATETIME VALUE] :: time <= '19:00:00 ')、また、良いフィルタを得るために、日付の時間値の "time"を取得する必要があります[DATETIME VALUE] :: time – ComputerSaysNo

答えて

1

感謝をありがとう - 私は上記のコメントで述べたBETWEEN文を使用して、所望の結果を得ることができたように見えます。私は最初に問題の時間の開始日と終了日を指定しました(日付部分は1900年1月01日だったので、それは問題ではありませんでした)。この方法で私は時間だけを比較することができました。

;WITH CTE 
AS ( SELECT 
     ID,StartAptDate,EndAptDate, 
     RowNumber = ROW_NUMBER() OVER(ORDER BY StartAptDate ASC) 
     FROM Appointments WHERE StylistId = 1 AND StartAptDate > CAST(CONVERT(CHAR(8), GetDate() - 5, 112) AS DATETIME) 
    ) 
    SELECT FirstApptAvail = min(a.EndAptDate) 
    FROM CTE a 
     INNER JOIN CTE b 
     ON a.RowNumber = b.RowNumber - 1 
    WHERE datediff(minute, a.EndAptDate, b.StartAptDate) >= 15 AND (CAST (CONVERT(CHAR(8), a.StartAptDate, 108) AS DATETIME) BETWEEN '1900-01-01 07:59:59' AND '1900-01-01 18:59:59' AND CAST (CONVERT(CHAR(8), a.EndAptDate, 108) AS DATETIME) BETWEEN '1900-01-01 07:59:59' AND '1900-01-01 18:59:59') 
関連する問題