我在Mysql中有一个表,其中有一个名为'dep_timestamp'的列,它以下列格式保存数据(数据是从外部源接收的,因此无法更改,并通过Web查询显示,因此不能在该表中修改)
2015-05-12 19:18:00 +0100
数据库保留了预订的出租车行程的取消,这些行程将从中央预订系统实时推送给我。在一整天中,我将收到任意数量的已取消旅程的消息。旅程的预订出发时间dep_timestamp
的格式为2015-05-12 19:18:00 +0100
,用于报告和其他所有内容。
每天03:00我想删除所有已取消的“昨天”离开的旅程。这意味着当我的用户进行查询并询问今天取消了哪些旅程时他们只会看到已预订的内容今天离开。
我在服务器上设置了一个事件,使用以下代码删除超过1天的行;
DELETE FROM db.canx_today WHERE 'dep_timestamp' < DATE_SUB(CURRENT_TIME() , INTERVAL 1 DAY)
该事件设置为每天03:00运行并且没有错误。然而,在运行时需要考虑完整的日期/时间,这意味着它只删除时间和时间的行。日期都超过一天。
如果我将CURRENT_TIME
与CURRENT_DATE
交换,则服务器会抛出此错误; Truncated incorrect datetime value: '2015-05-13 10:17:00 +0100'
到目前为止,它正在寻找一个完整的日期/时间字符串。
有没有办法忽略时间元素,只删除前一天的所有行?
答案 0 :(得分:1)
您可以根据CURRENT_DATE()
计算,只需将00:00:00
连接到该值。
WHERE `dep_timestamp` < CONCAT(CURRENT_DATE(), ' 00:00:00')
答案 1 :(得分:0)
这应该有效,但如果dep_timestamp
被编入索引,则只会比我最初在上述评论中提出的要快得多。
WHERE `dep_timestamp` < DATE_FORMAT(curdate(), "%Y-%m-%d 00:00:00")
由于DATE_FORMAT()实际上返回一个字符串,因此在实际需要索引时这可能更有效:
WHERE `dep_timestamp` < CAST(DATE_FORMAT(curdate(), "%Y-%m-%d 00:00:00") AS DATETIME)
答案 2 :(得分:0)
DELETE FROM `canx_today`
WHERE DATE(`dep_timestamp`) = DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY);