错误代码:1292。截断的不正确时间值

7
SELECT *
FROM SESSIONS
WHERE TIME_TO_SEC(TIMEDIFF(NOW(), SESSION_CREATED)) / 3600 >= 24

这给我2个结果。
DELETE FROM SESSIONS
WHERE TIME_TO_SEC(TIMEDIFF(NOW(), SESSION_CREATED)) / 3600 >= 24

这给我返回了一个错误代码:1292。削减不正确的时间值。

SESSION_CREATED 列为 TIMESTAMP 数据类型。

实际数据:

SESSION_ID      SESSION_CREATED
223133          2017-05-22 07:14:34
223134          2017-05-22 07:14:36

如何使选择操作可以工作,但删除操作不起作用?


有任何触发器涉及吗? - jarlh
你能发布你的数据吗? - RoMEoMusTDiE
now()sql-server 中是否有效? - Utsav
@Utsav - MySQL,我的错误。 - Vlad C
@jarlh - 没有触发器参与,只是普通的SQL。 - Vlad C
显示剩余2条评论
2个回答

19

为什么要使用这样复杂的表达方式?为什么不直接做:

DELETE FROM SESSIONS
    WHERE SESSION_CREATED < NOW() - INTERVAL 1 DAY;

关于为什么您的代码可能失败,原因是它在使用timediff()函数,而此函数的范围受时间数据类型的限制。 具体来说:

MySQL以“HH:MM:SS”格式(对于较大的小时值,为'HHH:MM:SS'格式)检索和显示TIME值。 TIME值的范围可以从'-838:59:59'到'838:59:59'。

由于您正在使用NOW()函数,每次迭代时值都会更改。您只是在数据还不太旧的情况下运行了SELECT,而在数据变得过老后运行了DELETE


这很有道理,但是...每天我运行select语句都能得到结果(从未崩溃),但是每天我运行delete语句时,都会遇到这个错误。这不可能是时间的问题。无论如何,我将使用您的语句,谢谢。 - Vlad C
您可能想要使用 SESSION_CREATED <= NOW() - INTERVAL 1 DAY @Vlad Florin - Raymond Nijland
是的,有一些解决方案可以用于我需要的删除操作。我只是想知道为什么这个特定的解决方案不行。 - Vlad C

1

使用MySQL的TIMESTAMPDIFF计算时间差的示例:

要使用TIMESTAMPDIFF,需要定义单位(SECONDMINUTEHOUR...),以及起始和结束日期(必须是时间戳数据类型)。

ROUND( TIMESTAMPDIFF(HOUR, initial_date, CURRENT_TIMESTAMP()) / 24, 2 )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接