[英]SQL Select if DateTime is between some Time interval
我有表T1:
ID SCHEDULE
1 2018-05-12 14:00:00
我有桌子T2
SCHEDULESTART SCHEDULEEND
09:00 17:00
我需要從T1表中執行SELECT。
我想從T1獲取所有行,其中SCHEDULE字段的TIME在時間段之間(第二個表的START和END)。
我正在某些IBM應用程序中工作,該應用程序只能從第一個表T1的WHERE子句之后以SQL語句開始。
因此,查詢(不幸的是)必須始終以"SELECT * FROM T1 WHERE..."
開頭"SELECT * FROM T1 WHERE..."
這不能更改(請記住這一點)。
這意味着我不能在"FROM T1"
部分之后使用某些JOIN或UNION ALL語句,因為僅在WHERE子句之后才能開始編寫SQL查詢。
對於此示例,可以使用如下語句:
select TIME(SCHEDULE) from T1
where TIME(SCHEDULE)>=(SELECT SCHEDULESTART FROM T2 )
AND TIME(SCHEDULE)<=(SELECT SCHEDULEEND FROM T2)
它將返回正確的結果。
但是,如果例如SCHEDULE是2018-05-12 23:00:00
且SCHEDULESTART is 22:00:00
2018-05-12 23:00:00
且SCHEDULESTART is 22:00:00
SCHEDULEEND is 03:00:00
則此查詢將不起作用(這是合理的,因為時間是在晚上和從第一天切換到第二天)! T2表中可以計算的最大時間段是24小時時間段(僅一天)。
應該如何精確定義SQL查詢以涵蓋所有情況? 謝謝,
這是一個復雜的例子。 我將您的版本寫為:
where EXISTS (SELECT 1 FROM T2 WHERE TIME(T1.SCHEDULE) BETWEEN SCHEDULESTART AND SCHEDULEEND)
然后,您可以將其修改為:
where EXISTS (SELECT 1
FROM T2
WHERE (SCHEDULESTART <= SCHEDULEEND AND
TIME(T1.SCHEDULE) BETWEEN SCHEDULESTART SCHEDULEEND)
) OR
(SCHEDULESTART > SCHEDULEEND AND
TIME(T1.SCHEDULE) NOT BETWEEN SCHEDULESTART AND SCHEDULEEND)
)
);
嘗試這個:
where
EXISTS (
SELECT
1
FROM
T2
WHERE
(
SCHEDULESTART <= SCHEDULEEND
AND
TIME(T1.SCHEDULE) BETWEEN SCHEDULESTART AND SCHEDULEEND
)
OR
(
SCHEDULESTART > SCHEDULEEND AND
(
TIME(T1.SCHEDULE) NOT BETWEEN SCHEDULEEND AND SCHEDULESTART
)
OR
TIME(T1.SCHEDULE) = SCHEDULESTART
OR
TIME(T1.SCHEDULE) = SCHEDULEEND
)
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.