【问题标题】:MySQL (Aurora) update timestamp using adddate or date-add or date-sub says syntax errorMySQL (Aurora) 使用 adddate 或 date-add 或 date-sub 更新时间戳表示语法错误
【发布时间】:2021-03-22 05:49:06
【问题描述】:

你们中的任何人都可以在这里找出 mySQL 更新语句的语法错误吗?

update table_name set start_time = DATE_ADD (start_time , INTERVAL 2 DAY) where start_time = '2020-12-08 10:47:00';

以上是简单的 mySQL 查询,将 start_time(时间戳)更新 2 天。

AFAIK,上面应该可以工作,而且并不复杂。但我收到语法错误,我无法理解为什么会出现语法错误。这是我得到的错误...

数据库错误代码:1064。消息:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 10 行的 ') where start_time = '2020-12-08 10:47:00'' 附近使用正确的语法

我也尝试过其他变种,例如...

update table_name set start_time = adddate (start_time , INTERVAL 2 DAY) where start_time = '2020-12-08 10:47:00';

update table_name set start_time = date_sub (start_time , INTERVAL -2 DAY) where start_time = '2020-12-08 10:47:00';

数据库错误代码:1064。消息:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的 ') where start_time = '2020-12-08 10:47:00'' 附近使用正确的语法

如果我在 select 语句中使用 date_sub,

select * from table_name where start_time  > DATE_SUB(now() , INTERVAL 2 DAY);

它确实像一个魅力。但我无法在 set =.... 的更新语句中使用它。

我只是无法理解出了什么问题,并且很想知道语法有什么问题。你能推荐一下吗?

【问题讨论】:

    标签: mysql sql datetime date-arithmetic aws-aurora-serverless


    【解决方案1】:

    似乎问题在于函数名和左括号之间的空格。

    这个:

    DATE_ADD (start_time , INTERVAL 2 DAY)
    

    应该写成:

    DATE_ADD(start_time , INTERVAL 2 DAY)
    

    在使用DATE_SUB() 的示例中没有发生这种情况,因为前导空格不存在。

    并不是所有的 MySQL 函数都有这样的限制。这与MySQL解析器处理函数名的方式有关,即described in the documentation

    函数调用在名称和括号之间没有空格的要求仅适用于有特殊考虑的内置函数。

    DATE_ADD()DATE_SUB() 被列为受影响的函数。您可以使用SQL mode IGNORE_SPACE 来更改默认行为。

    总体而言,我建议您像这样使用日期算术,因此您无需担心此类警告(而且它还可以提高代码的可读性):

    start_time + INTERVAL 2 day
    

    【讨论】:

    • 我真的不知道该说什么。那是我在这里的第一篇文章,我几乎不希望有人回答。 @GMB 您的个人资料显示了很多 SQL/DB。我喜欢 DBMS 和 SQL,并且很好奇它为什么不起作用——对我来说这似乎是一个轻微的“错误”。这应该被报告为错误吗?
    • @Arun:欢迎。我深入研究了文档:这不是错误。我用更多信息编辑了我的答案。
    猜你喜欢
    • 2017-02-17
    • 2018-06-09
    • 1970-01-01
    • 2014-03-05
    • 2013-12-10
    • 1970-01-01
    相关资源
    最近更新 更多