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
如果 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