有人可以告诉我为什么如果在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%'
答案 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 SO和techonthenet.com/mysql/between.php