首页 > 解决方案 > Mysql 不会创建结束日期在 2038-01-19 之后的 EVENT

问题描述

我试图在 mysql 中创建一个事件,并且似乎如果结束日期超过 20 年,它就无法创建它。

从今天开始,明天完成作品:

mysql> CREATE EVENT test
    -> ON SCHEDULE EVERY 1 DAY
    -> STARTS '2020-07-24 13:30:00'
    -> ENDS '2020-07-25 13:30:00'
    -> DO 
    -> SELECT 1 FROM DUAL;
Query OK, 0 rows affected (0.00 sec)

从今天开始在 50 年后结束,不起作用:

mysql> CREATE EVENT test
    -> ON SCHEDULE EVERY 1 DAY
    -> STARTS '2020-07-24 13:30:00'
    -> ENDS '2070-07-25 13:30:00'
    -> DO 
    -> SELECT 1 FROM DUAL;
ERROR 1543 (HY000): ENDS is either invalid or before STARTS

mysql> -- also with different time format

mysql> CREATE EVENT test
    -> ON SCHEDULE EVERY 1 DAY
    -> STARTS '2020-07-24 13:30:00'
    -> ENDS CURRENT_TIMESTAMP + INTERVAL 50 YEAR
    -> DO 
    -> SELECT 1 FROM DUAL;
ERROR 1543 (HY000): ENDS is either invalid or before STARTS

在 20 年内都不起作用:

mysql> CREATE EVENT test
    -> ON SCHEDULE EVERY 1 DAY
    -> STARTS '2020-07-24 13:30:00'
    -> ENDS '2040-07-25 13:30:00'
    -> DO 
    -> SELECT 1 FROM DUAL;
ERROR 1543 (HY000): ENDS is either invalid or before STARTS

mysql> CREATE EVENT test
    -> ON SCHEDULE EVERY 1 DAY
    -> STARTS '2020-07-24 13:30:00'
    -> ENDS CURRENT_TIMESTAMP + INTERVAL 20 YEAR
    -> DO 
    -> SELECT 1 FROM DUAL;
ERROR 1543 (HY000): ENDS is either invalid or before STARTS

15年是可以接受的:

mysql> CREATE EVENT test
    -> ON SCHEDULE EVERY 1 DAY
    -> STARTS '2020-07-24 13:30:00'
    -> ENDS CURRENT_TIMESTAMP + INTERVAL 15 YEAR
    -> DO 
    -> SELECT 1 FROM DUAL;
Query OK, 0 rows affected (0.01 sec)

有谁知道为什么会这样?

标签: mysqlevents

解决方案


MySQL 事件时间戳使用 32 位 UNIX 时间戳格式。

https://dev.mysql.com/doc/refman/8.0/en/datetime.html说:

TIMESTAMP 数据类型用于同时包含日期和时间部分的值。TIMESTAMP 的范围为 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC。

此错误中也确定了此限制:https ://bugs.mysql.com/bug.php?id=16396


推荐阅读