我有桌子T1:
ID SCHEDULE
1 2018-05-12 14:00:00我有T2桌
SCHEDULESTART SCHEDULEEND
09:00 17:00我需要从T1表中进行选择。
我想从T1获取所有的行,其中调度字段中的时间位于时间段之间(从第二个表开始和结束)。
我在一些IBM应用程序中工作,其中只有可能的在第一个表T1的where子句之后从T1语句开始。
因此,查询(不幸)必须始终以"SELECT * FROM T1 WHERE..."开头,这是不能更改的(请记住这一点)。
这意味着我不能在"FROM T1"部件之后使用某些JOIN或UNION语句,因为我只能在WHERE子句之后才开始编写SQL。
在这个例子中,这样的语句是可以的:
select TIME(SCHEDULE) from T1
where TIME(SCHEDULE)>=(SELECT SCHEDULESTART FROM T2 )
AND TIME(SCHEDULE)<=(SELECT SCHEDULEEND FROM T2)它将返回正确的结果。
但是,如果调度是2018-05-12 23:00:00、SCHEDULESTART is 22:00:00和SCHEDULEEND is 03:00:00,那么这个查询就不能工作(这是合乎逻辑的,因为时间是在夜间,从第一天切换到第二天)!可在T2表中计算的最大时间周期为24小时时间段(仅为1天)。
如何确切地定义SQL查询以涵盖所有情况?谢谢,
发布于 2018-05-11 12:09:33
这是一个复杂的例子。我会把你的版本写成:
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)
)
);发布于 2018-05-11 12:33:47
试试这个:
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
)
);https://stackoverflow.com/questions/50292011
复制相似问题