试图理解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。
答案 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。
答案 1 :(得分:-2)
您不能使用DATE_ADD()
代替ADDTIME()
,因为前者会将您的TIMESTAMP
/ DATETIME
值转换为DATE
并且会将时间部分放宽。
改为使用TIMESTAMPADD()
:
UPDATE table3 SET update_time = TIMESTAMPADD( DAY, 60, NOW() ) WHERE id = 1;