Mysql ADDTIME函数给出错误截断的错误时间值:'35 00:00:00'

时间:2017-08-10 13:55:23

标签: mysql datetime

试图理解ADDTIME()实际上是如何运作的 样本表:

CREATE TABLE table3 (
  id INT(11) NOT NULL AUTO_INCREMENT,
  update_time DATETIME NOT NULL,
  PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=latin1;  

示例数据:

+-----+-----------------------+
| id  |      update_time      |
+-----+-----------------------+
| 1   | 2017-09-13 18:55:24   |
| 2   | 2017-08-10 18:53:16   |
+-----+-----------------------+

如果我执行以下查询,则会给出错误:

UPDATE table3 SET update_time = ADDTIME(NOW(), '60 00:00:00') WHERE id=1;  

Error Code: 1292  
Truncated incorrect time value: '60 00:00:00'

虽然以下查询可以正常工作:

UPDATE table3 SET update_time = ADDTIME(NOW(), '5 00:00:00') WHERE id=1;  

试图继续增加DAY的值,发现它在DAY=34之前正常工作并且在DAY > 34时中断; 无法找到一个明确的答案,为什么它在限制后中断。有人可以解释它是如何工作的吗? PS:我知道可以使用DATE_ADD()代替,我使用的是MySql 5.7.12。

2 个答案:

答案 0 :(得分:1)

根据手册:

  

MySQL以这些格式识别TIME值:

     
      
  • 作为DHH:MM:SS'中的字符串格式。您还可以使用以下“宽松”语法之一:' HH:MM:SS',' HH:MM',' D HH:MM',& #39; D HH',   或者' SS'。 此处D表示天数,可以包含0到34之间的值。

  •   
  • 作为HHMMSS'中没有分隔符的字符串格式,只要它有意义。例如,' 101112'被理解为   ' 10:11:12',但' 109712'是非法的(它有一个荒谬的分钟部分)   并成为' 00:00'。

  •   
  • 作为HHMMSS格式的数字,只要它作为时间有意义。例如,101112被理解为' 10:11:12'。下列   替代格式也被理解为:SS,MMSS或HHMMSS。

  •   

限制与the answer by @ReneS

中指出的时间类型范围(以及最可能的基础存储要求)有关

Reference

答案 1 :(得分:-2)

您不能使用DATE_ADD()代替ADDTIME(),因为前者会将您的TIMESTAMP / DATETIME值转换为DATE并且会将时间部分放宽。

改为使用TIMESTAMPADD()

UPDATE table3 SET update_time = TIMESTAMPADD( DAY, 60, NOW() ) WHERE id = 1;