Mysql 与IN子句一起使用的特定日期截断了错误的日期值
我得到了错误Mysql 与IN子句一起使用的特定日期截断了错误的日期值,mysql,sql,Mysql,Sql,我得到了错误 Warning: #1292 Incorrect datetime value: ''2021-04-01 00:00:00','2021-03-26 00:00:00','2021-03-10 00:00:00','2021-01-08 00:00:00','2020-10-09 00:00:00','2020-04-09 00:...' 在使用以下SQL语句时 SELECT * FROM MF_NAVs WHERE SchemeCode=120503 AND Date IN
Warning: #1292 Incorrect datetime value: ''2021-04-01 00:00:00','2021-03-26 00:00:00','2021-03-10 00:00:00','2021-01-08 00:00:00','2020-10-09 00:00:00','2020-04-09 00:...'
在使用以下SQL语句时
SELECT * FROM MF_NAVs WHERE SchemeCode=120503 AND Date IN (
SELECT
CONCAT(
"'",
CONCAT_WS("','",
MAX(7Day),
MAX(15Day),
MAX(1MONTH),
MAX(3MONTH),
MAX(6MONTH),
MAX(1YEAR),
MAX(3YEAR),
MAX(5YEAR)
)
,"'") AS Dates
FROM
(
SELECT
CASE WHEN `Date` <= now()- INTERVAL 7 DAY THEN TIMESTAMP(Date,'00:00:00') END AS 7Day,
CASE WHEN `Date` <= now()- INTERVAL 15 DAY THEN TIMESTAMP(Date,'00:00:00') END AS 15Day,
CASE WHEN `Date` <= now()- INTERVAL 1 MONTH THEN TIMESTAMP(Date,'00:00:00') END AS 1MONTH,
CASE WHEN `Date` <= now()- INTERVAL 3 MONTH THEN TIMESTAMP(Date,'00:00:00') END AS 3MONTH,
CASE WHEN `Date` <= now()- INTERVAL 6 MONTH THEN TIMESTAMP(Date,'00:00:00') END AS 6MONTH,
CASE WHEN `Date` <= now()- INTERVAL 1 YEAR THEN TIMESTAMP(Date,'00:00:00') END AS 1YEAR,
CASE WHEN `Date` <= now()- INTERVAL 3 YEAR THEN TIMESTAMP(Date,'00:00:00') END AS 3YEAR,
CASE WHEN `Date` <= now()- INTERVAL 5 YEAR THEN TIMESTAMP(Date,'00:00:00') END AS 5YEAR
FROM MF_NAVs
WHERE SchemeCode=120503
ORDER BY Date DESC
) AS X
)
如何修复错误?首先,让我们讨论问题的本质,即将字符串与日期进行比较 IN谓词需要一个离散值列表。您给了它一个字符串值,该值恰好包含逗号 想想这两个谓词之间的区别:
WHERE mycolumn IN ('A','B','C')
WHERE mycolumn IN ('A,B,C')
上面的第一个例子是三个引用值。第二个是一个带引号的值,恰好包含逗号
在问题的代码中,您将显示:
SELECT * FROM MF_NAVs WHERE SchemeCode=120503 AND Date IN ( ...subquery... )
但是子查询返回一个字符串,即一列一行。IN谓词内的子查询必须以多行形式返回多个值。只有在括号内有一个值列表时,才可以使用IN运算符。但是,您构造了一个字符串,它是一个以逗号分隔的日期列表。
我认为您可以通过条件聚合和使用FIND_IN_SET来简化代码:
请解释你想做什么。我猜有一个更简单的构造。]从mf_navs表中,我需要所有列,但只需要7天前、15天前、1个月前、1年前、3年前和5年前的列。假设mf_navs.Date是一个日期,而不是带有日期表示的字符串,则不需要该组。除非与LIMIT一起使用,否则派生表中的ORDER BY是无意义的。Date的数据类型是什么?TIMESTAMPDate的用途是什么,'00:00:00'?@stickybit数据类型的日期是Date,没有concats我得到以下错误-1241-操作数应该包含1列非常感谢您的帮助。
SELECT * FROM MF_NAVs WHERE SchemeCode=120503 AND Date IN ( ...subquery... )
SELECT *
FROM MF_NAVs
WHERE SchemeCode=120503
AND FIND_IN_SET(
Date,
(
SELECT
CONCAT_WS( ',',
MAX(CASE WHEN Date <= CURRENT_DATE - INTERVAL 7 DAY THEN Date END),
MAX(CASE WHEN Date <= CURRENT_DATE - INTERVAL 15 DAY THEN Date END),
MAX(CASE WHEN Date <= CURRENT_DATE - INTERVAL 1 MONTH THEN Date END),
MAX(CASE WHEN Date <= CURRENT_DATE - INTERVAL 3 MONTH THEN Date END),
MAX(CASE WHEN Date <= CURRENT_DATE - INTERVAL 6 MONTH THEN Date END),
MAX(CASE WHEN Date <= CURRENT_DATE - INTERVAL 1 YEAR THEN Date END),
MAX(CASE WHEN Date <= CURRENT_DATE - INTERVAL 3 YEAR THEN Date END),
MAX(CASE WHEN Date <= CURRENT_DATE - INTERVAL 5 YEAR THEN Date END)
)
FROM MF_NAVs
WHERE SchemeCode=120503
)
)