0

StartTime私は2つの列を含み、他EndTimeのタイプのテーブルを持っています。特定の入力時間範囲と競合Timeする行を取得したい。StartTimeEndTime

テーブルに次の行が含まれているとします。

ID Status StartTime EndTime
-- ------ --------- --------
0     0   08:00:00  08:50:00
1     1   08:50:00  09:40:00

08:00:00そして、 which が range -と競合するようにしたい08:40:00。最初の行を返す必要があります。

私はそれを次のようにしようとしています:

SELECT *
FROM MyTable
WHERE
StartTime BETWEEN '08:00:00' AND '08:40:00'
OR
EndTime BETWEEN '08:40:00' AND '08:40:00'

誰かが私の問題を解決してくれたら、とても感謝します。

4

5 に答える 5

4

@John Deweyに同意します。特定の範囲と競合する範囲を見つけたい場合、条件は不完全に見えます。ジョンが正しく指摘したように、指定された範囲が完全にテーブル内の範囲の境界内にある場合、対応する行は条件に一致しません。

ただし、条件をより複雑にするのではなく、実際には次のように単純にすることができます。

SELECT *
FROM MyTable
WHERE StartTime <= '08:40:00'
  AND EndTime   >= '08:00:00'
于 2012-05-27T09:11:46.927 に答える
2

これは実際には起こらないかもしれませんが、徹底するために、範囲 '08:00:00' と '08:40:00' が完全に StartTime と EndTime の間にある競合もチェックします。たとえば、StartTime = 07:30: 00 および EndTime = 09:00:00:

SELECT *
FROM MyTable
WHERE (
    StartTime BETWEEN '08:00:00' AND '08:40:00'
    OR
    EndTime BETWEEN '08:00:00' AND '08:40:00'
    OR
    '08:00:00' BETWEEN StartTime AND EndTime
    OR
    '08:40:00' BETWEEN StartTime AND EndTime
)
于 2012-05-27T05:10:50.290 に答える
1
SELECT * 
FROM MyTable 
WHERE 
   StartTime BETWEEN '08:00:00' AND '08:40:00' 
OR EndTime BETWEEN '08:00:00' AND '08:40:00' 
于 2012-05-27T03:58:00.717 に答える
1

2 番目の節はEndTime BETWEEN '08:00:00' AND '08:40:00'. そうでなければ、あなたが持っているものはうまくいくはずです。

于 2012-05-27T03:58:31.433 に答える
0

最初のレコードのみを返すには、 を使用し、 を使用TOPて '最初の'レコードを決定するときに必ず含めてください。これは、「最初の」値が開始時刻または終了時刻のいずれかによって決定される可能性があると想定しているためです。を使用するときはいつでも、サブクエリで通知を使用する必要があります。そうしないと、予期しない結果が得られます。ORDER BYTOP unionORDER BYTOP

SELECT TOP(1)[Status],StartTime,EndTime 
FROM (
      SELECT TOP(1) [Status],StartTime,EndTime,StartTime AS TEST
      FROM dbo.MyTable
      WHERE StartTime BETWEEN '08:00:00' AND '08:40:00'
      ORDER BY StartTime DESC 
      UNION ALL
      SELECT TOP(1) [Status],StartTime,EndTime,EndTime AS TEST
      FROM dbo.MyTable
      WHERE
      EndTime BETWEEN '08:00:00' AND '08:40:00'
      ORDER BY EndTime DESC 
) x
ORDER BY TEST DESC

「最初の」レコードが 1 つの値、たとえば starttime によってのみ決定される場合は、次のようにします。

SELECT TOP(1) [Status],StartTime,EndTime 
FROM dbo.MyTable
WHERE StartTime BETWEEN '08:00:00' AND '08:40:00'
OR EndTime BETWEEN '08:00:00' AND '08:40:00'
ORDER BY StartTime DESC
于 2012-05-27T04:34:39.930 に答える