Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 与IN子句一起使用的特定日期截断了错误的日期值_Mysql_Sql - Fatal编程技术网

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
      ) 
    )