我使用的是UNIX_TIMESTAMP(),但是当我传递未来很久的日期时,它会在某个时候开始返回NULL。
例如,下面的SQL为我提供了一个正确的非空结果:SELECT UNIX_TIMESTAMP(ADDDATE(NOW(), INTERVAL 18 YEAR))。
但是,如果我将该值增加一年,则返回的值将为NULL:SELECT UNIX_TIMESTAMP(ADDDATE(NOW(), INTERVAL 19 YEAR))。
这里有什么问题?会不会是整数溢出?我该怎么解决呢?
我使用的是以下MariaDB版本:ver15.1要闻10.4.7-MariaDB,用于Linux (x86_64),使用readline5.1
发布于 2019-09-07 17:38:17
Unix时间(签名32位)结束于03:14:07 Tuesday, 19 January 2038 UTC
相关:问题
时间戳: MariaDB中的时间戳的最大值为2147483647,相当于2038-01-19 05:14:07.这是由于底层的32位限制.在超过此日期的日期上使用函数将导致返回NULL。如果您需要日期以外的日期,使用DATETIME作为存储类型。
SELECT ADDDATE(NOW(), INTERVAL 19 YEAR) -- DATETIME
-- 2038-09-07 18:42:39发布于 2021-12-26 12:45:22
正如我在上面的评论中指出的那样,我无法让它工作通过2038年“启示录”的日期限制,甚至不能将字段转换为日期时间。可能还有其他因素影响到这一最终解决办法。
我能找到的唯一解决办法是从PHP获取DB中的日期,并使用strtotime() PHP函数从其中获取UNIX时间戳。
SELECT DATE_FORMAT(CONVERT(thedatefield, DATETIME),"%Y-%m-%dT%TZ") AS thedatefield由于有不同的日期格式(美国、英语、拉丁文等)这是不兼容和可能的麻烦来源,我使用两个MySQL/ MariaDB函数将输出平缓到一个ISO (YYY:mm:ss)。一旦输出在任何系统中都是一致的,您就可以将输出传递给strtotime() PHP函数,并确信它将被正确地解析为UNIX时间戳。
转换:将日期转换为日期时间DB类型。
DATE_FORMAT:将日期转换为ISO格式(YYY:mm:ss).
当然,您可以删除这些功能,并根据系统的特殊性调整解决方案,以减少处理负载。此建议的解决方案将适用于任何系统日期样式。
如果PHP只返回一个寄存器(最简单的情况),我将返回的2D或表数组的第一个维度设置为0
date("U",strtotime($php_array[0][thedatefield]))PHP ()函数凭借"U“标志将DB输出转换为UNIX时间戳,而不受32位2038 Epochalipse限制。
https://stackoverflow.com/questions/57836038
复制相似问题