2017-06-14 112 views
-1

我有一个简单的表,在下面的例子中有一个名为timeC的TIME列。我想选择所有timeC在过去五分钟内的记录。我尝试了以下和许多变化没有成功。MySQL中TIME字段的最近记录

SELECT * FROM sample_schema.`exampleTable` 
WHERE MINUTE(TIMEDIFF(SELECT TIME(NOW())), `timeC`)<5; 

请注意,列是TIME,而不是DATETIME或TIMESTAMP。

对此提出建议?

+2

由于'TIME'类型只包含时间,即不知道它属于哪个日期,所以我不确定你想要查询什么,真的:) – AKX

+0

@akx,这个问题受到限制,使得被检查的记录总是从查询运行当天的较早时刻开始。 –

回答

1

你的圆括号在错误的地方。所以你用1个参数调用TIMEDIFF(),并用2个参数调用MINUTE()。此外,您不需要使用SELECT来获得TIME(NOW()),您可以将该函数调用用作参数。

SELECT * 
FROM exampleTable 
WHERE MINUTE(TIMEDIFF(TIME(NOW()), timeC)) < 5 

但是,这仍然存在问题。 TIMEDIFF()如果timeC当天晚些时候可以返回负值时间,但MINUTE()总是返回分钟的正值,所以这将匹配5分钟前到5分钟后的任何值。简单地将时间与范围进行比较会更好:

SELECT * 
FROM exampleTable 
WHERE timeC BETWEEN TIME(DATE_SUB(NOW(), INTERVAL 5 MINUTE)) AND TIME(NOW()) 

有一个重要问题。如果您在午夜后不久执行此查询,则提前5分钟的时间将比前一天晚。例如,如果它当前是00:02,则提前5分钟将是23:57,并且没有任何内容会与BETWEEN表达式匹配。你需要检查:

SELECT * 
FROM exampleTable 
WHERE CASE 
    WHEN TIME(NOW()) >= '00:05' 
     THEN timeC BETWEEN TIME(DATE_SUB(NOW(), INTERVAL 5 MINUTE)) AND TIME(NOW()) 
    ELSE timeC BETWEEN '00:00' AND TIME(NOW()) 
     OR 
     timeC BETWEEN TIME(DATE_SUB(NOW(), INTERVAL 5 MINUTE)) AND '23:59:59' 
    END