我遇到了让我的数据返回的问题。我有两次没有00:00:00的日期,我试图比较它们。当前准时时间为09:00:00,关闭时间目前为02:00:00。比较的时间,如在我的SQL中是18:21:00,这是在开启和关闭时间之间,但我无法得到结果。
这是我的SQL:
SELECT zdate
FROM zones
WHERE '18:21:00' BETWEEN time_on AND time_off
答案 0 :(得分:2)
请注意,“x BETWEEN y AND z
”假定y
小于z
;它永远不会返回任何东西。它相当于“x >= y AND x <= z
”。
鉴于在这种情况下关闭时间是在午夜之后,那么你需要做一个更复杂的条件:
SELECT zdate
FROM zones
WHERE (time_on < time_off AND '18:21:00' BETWEEN time_on AND time_off)
OR (time_on > time_off AND ('18:21:00' > time_on OR '18:21:00' < time_off))
第一个条件是正常时间是与休息时间同一天。第二种方法检查目标时间是在时间之后(并且隐含地在午夜之前),或者是在时间关闭之前(因此在午夜和休息时间之间)。
为了更好的对称性:
SELECT zdate
FROM zones
WHERE (time_on < time_off AND ('18:21:00' > time_on AND '18:21:00' < time_off))
OR (time_on > time_off AND ('18:21:00' > time_on OR '18:21:00' < time_off))
在MacOS X 10.6.2上使用IBM Informix Dynamic Server(IDS)11.50.FC4W1的示例输出。 IDS使用'DATETIME HOUR TO SECOND'作为标准SQL中TIME类型的等价物。
CREATE TEMP TABLE zones
(
time_on DATETIME HOUR TO SECOND NOT NULL,
time_off DATETIME HOUR TO SECOND NOT NULL
);
INSERT INTO zones VALUES ('09:00:00', '02:00:00');
INSERT INTO zones VALUES ('07:00:00', '19:00:00');
INSERT INTO zones VALUES ('20:00:00', '22:00:00');
INSERT INTO zones VALUES ('10:00:00', '15:15:00');
INSERT INTO zones VALUES ('21:00:00', '04:00:00');
CREATE TEMP TABLE times
(
zdate DATETIME HOUR TO SECOND NOT NULL
);
INSERT INTO times VALUES ('18:21:00');
INSERT INTO times VALUES ('08:30:00');
INSERT INTO times VALUES ('20:30:00');
INSERT INTO times VALUES ('12:30:00');
SELECT zdate, time_on, time_off
FROM zones CROSS JOIN times
WHERE (time_on < time_off AND (zdate > time_on AND zdate < time_off))
OR (time_on > time_off AND (zdate > time_on OR zdate < time_off))
ORDER BY zdate, time_on, time_off
输出数据:
08:30:00 07:00:00 19:00:00
12:30:00 07:00:00 19:00:00
12:30:00 09:00:00 02:00:00
12:30:00 10:00:00 15:15:00
18:21:00 07:00:00 19:00:00
18:21:00 09:00:00 02:00:00
20:30:00 09:00:00 02:00:00
20:30:00 20:00:00 22:00:00
我认为这看起来是正确的。
答案 1 :(得分:1)
你的问题是你的“日间界限”不是午夜,而是白天的其他一些点。不幸的是,由于您的列只存储时间,因此无论是在今天还是明天(或其他某天),都无法确定任何给定时间。正确的解决方案是存储完整的日期和时间,以便您的比较有意义。
如果这是不可能的,那么您必须确定您的数据是否允许确定一致的日界。有效的日期边界将具有没有任何间隔穿过它的属性。如果存在这样的时间点,则可以在比较之前通过此偏移调整所有时间值。例如,如果您确定09:00(上午9点)是有效边界,则只需从两个时间减去9小时,这将使它们在相同的24小时内同时进行直接比较。
答案 2 :(得分:0)
18:21如果转换为12小时时间,下午6:21你比较上午9:00到凌晨2:00这是荒谬的,所以绝对不会得到任何结果。
除非你指的是第二天凌晨2点,否则这是另一个问题。