MySQL两个时间戳之间的区别

时间:2009-12-22 02:43:49

标签: mysql

我遇到了让我的数据返回的问题。我有两次没有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

3 个答案:

答案 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点,否则这是另一个问题。

相关问题