Mysql - 带有 datetime LIKE '2018-01%' 的 where 子句中的 datetime 值不正确

Mysql - Incorrect datetime value in where clause with datetime LIKE '2018-01%'

如果 datetime 上有 LIKE 子句,有人能告诉我为什么这个命令会抛出错误吗?这是代码:

UPDATE surveys
LEFT JOIN tasks ON surveys.task_id = tasks.id
SET surveys.ended = tasks.date_to_resolve
WHERE tasks.date_to_resolve LIKE '2018-01%' AND surveys.ended LIKE '2018-02%'

它抛出错误“日期时间值不正确:第 1 行 'date_to_resolve' 的 '2018-01%' ” 最奇怪的是 SELECT 语句在相同条件下运行良好

SELECT * FROM surveys
LEFT JOIN tasks ON surveys.task_id = tasks.id
WHERE tasks.date_to_resolve LIKE '2018-01%' AND surveys.ended LIKE '2018-02%'

不要使用 like 作为日期。 MySQL 对实际日期函数有很好的支持。

所以:

WHERE tasks.date_to_resolve >= '2018-01-01' AND tasks.date_to_resolve < '2018-02-01' AND
      surveys.ended >= '2018-02-01' AND surveys.ended < '2018-03-01'

这可以防止日期和时间之间的隐式转换,并允许引擎使用优化器(如果有合适的优化器)。

编辑:

正确的update查询是:

UPDATE surveys s JOIN
       tasks t
       ON s.task_id = t.id
    SET s.ended = t.date_to_resolve
    WHERE t.date_to_resolve >= '2018-01-01' AND t.date_to_resolve < '2018-02-01' AND
          s.ended >= '2018-02-01' AND surveys.ended < '2018-03-01';

LEFT JOIN 正在被 WHERE 撤消,因此您不妨正确表达连接。

正如 Gordon 已经解释过的,不要对日期字段使用 like。

另一种选择是使用 between

WHERE tasks.date_to_resolve between '2018-01-01' AND '2018-02-01' 
  AND surveys.ended between '2018-02-01' AND '2018-03-01'

between question on SO and techonthenet.com/mysql/between.php