我有一张test_a号桌

CREATE TABLE `test_a` (
  `CUSTOMER_RK`         int         DEFAULT NULL,
  `CUSTOMER_STATUS`     varchar(45) DEFAULT NULL,
  `EFFECTIVE_FROM_DTTM` date        DEFAULT NULL,
  `EFFECTIVE_TO_DTTM`   date        DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

像这样填充的:

CUSTOMER_RK CUSTOMER_STATUS EFFECTIVE_FROM_DTTM EFFECTIVE_TO_DTTM
1 A 2004-01-20 2015-02-23
1 B 2016-02-24 2016-05-17
1 A 2017-05-18 9999-12-31
2 B 1998-09-01 2018-09-04
2 A 2018-09-05 2018-09-06
2 B 2019-09-07 2019-09-07
2 A 2019-09-08 9999-12-31

try 使用以下代码将此SELECT查询的结果插入到我的表中:

INSERT INTO test_a (
    CUSTOMER_RK, CUSTOMER_STATUS, EFFECTIVE_FROM_DTTM, EFFECTIVE_TO_DTTM
)
SELECT
    CUSTOMER_RK,
    CUSTOMER_STATUS,
    EFFECTIVE_FROM_DTTM,
    EFFECTIVE_TO_DTTM
FROM
    (
        SELECT
            CUSTOMER_RK,
            CUSTOMER_STATUS,
            DATE_ADD( EFFECTIVE_TO_DTTM, INTERVAL 1 DAY ) AS EFFECTIVE_FROM_DTTM,
            DATE_SUB( LEAD( EFFECTIVE_FROM_DTTM, 1, '9999-12-31' ) OVER ( ORDER BY EFFECTIVE_FROM_DTTM ), INTERVAL 1 DAY ) AS EFFECTIVE_TO_DTTM

        FROM
            test_a AS a1
        WHERE
            CUSTOMER_RK = 1
    ) AS a2
WHERE
    EFFECTIVE_FROM_DTTM < EFFECTIVE_TO_DTTM;

但得到了这样的错误:

18:53:59    INSERT INTO test_a (CUSTOMER_RK, CUSTOMER_STATUS, EFFECTIVE_FROM_DTTM, EFFECTIVE_TO_DTTM) SELECT CUSTOMER_RK, CUSTOMER_STATUS, EFFECTIVE_FROM_DTTM, EFFECTIVE_TO_DTTM FROM ( SELECT CUSTOMER_RK, CUSTOMER_STATUS, DATE_ADD(EFFECTIVE_TO_DTTM, INTERVAL 1 DAY) AS EFFECTIVE_FROM_DTTM,  DATE_SUB(LEAD(EFFECTIVE_FROM_DTTM, 1, '9999-12-31') OVER (ORDER BY EFFECTIVE_FROM_DTTM), INTERVAL 1 DAY) AS EFFECTIVE_TO_DTTM FROM test_a AS a1 WHERE CUSTOMER_RK = 1 ) AS a2 WHERE EFFECTIVE_FROM_DTTM < EFFECTIVE_TO_DTTM

Error Code: 1441. Datetime function: datetime field overflow    0.000 sec

为什么我得到这个错误?

Upd.:

MySQL版本:8.0.34

==同步,由Elderman更正==@elder_man

SELECT '9999-12-31' + INTERVAL 1 DAY;的结果是NULL

推荐答案

我不知道MySQL版本和SQL_MODE的组合会导致这种情况.请在您的问题中添加以下内容,因为我很想知道:

  1. MySQL版本(SELECT VERSION();)
  2. SQL_MODE(SELECT @@sql_mode;)
  3. SELECT '9999-12-31' + INTERVAL 1 DAY;人的结果

UPDATE:感谢您将上述答案添加到您的问题中.我不知道我昨晚在做什么/想什么,但它很容易复制.

您可以通过将有问题的值设为空来避免它.

变化

DATE_ADD( EFFECTIVE_TO_DTTM, INTERVAL 1 DAY ) AS EFFECTIVE_FROM_DTTM,

DATE_ADD( NULLIF(EFFECTIVE_TO_DTTM, '9999-12-31'), INTERVAL 1 DAY ) AS EFFECTIVE_FROM_DTTM,

IMHO, a better option is 至 s至re a more appropriate value when the EFFECTIVE_TO_DTTM is unknown, such as NULL.

这是一张db<>fiddle美元.

Mysql相关问答推荐

创建从表中筛选数据的过程时出错

JOOQ-如何在一个查询中引用多个(但不是所有)表中的所有字段

JPA对具有动态键和动态值的JSON列的原生查询

PythonAnywhere中SSH到MySQL数据库无限期挂起,SSH正确,workbench可以完美连接

Group_CONCAT CASE 乘法输出

MySQL MDL(元数据锁)为什么会导致死锁?

将 Cloud Function (nodejs) 连接到 CloudSQL mySQL 数据库

为两个中的每一个 Select 最大和最小传递条件

MySQL 在第一个匹配行后停止搜索 N 行(不是 LIMIT)

Mysql Pivot 查询/建议

在 Codeigniter MySQL 中从另一个数据库获取数据

If else on WHERE 子句

在 WHERE 子句中使用 CASE

从 MYSQL 查询中计算列的平均值

MySQL ORDER BY rand(),名称为 ASC

将sql查询的结果写入mysql中的文件

比较 MySQL 中的日期忽略 DateTime 字段的时间部分

SQL WHERE 列 = 一切

MySQL在哪里存储数据库文件?

如何将本地托管的 MySQL 数据库与 docker 容器连接