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

时间:2018-02-13 11:55:43

标签: mysql sql datetime sql-like

有人可以告诉我为什么如果在datetime上有LIKE clasue,这个命令会抛出一个错误?这是代码:

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%'

它会引发错误" 日期时间值不正确:' 2018-01%'对于列' date_to_resolve'在第1行" 最奇怪的是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%'

2 个答案:

答案 0 :(得分:1)

不要将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,因此您也可以正确表达加入。

答案 1 :(得分:0)

正如戈登已经解释的那样,不要在日期字段中使用like。

另一种选择是使用

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 SOtechonthenet.com/mysql/between.php