首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将来使用日期时,MariaDB UNIX_TIMESTAMP()返回NULL

将来使用日期时,MariaDB UNIX_TIMESTAMP()返回NULL
EN

Stack Overflow用户
提问于 2019-09-07 17:37:01
回答 2查看 670关注 0票数 2

我使用的是UNIX_TIMESTAMP(),但是当我传递未来很久的日期时,它会在某个时候开始返回NULL。

例如,下面的SQL为我提供了一个正确的非空结果:SELECT UNIX_TIMESTAMP(ADDDATE(NOW(), INTERVAL 18 YEAR))

但是,如果我将该值增加一年,则返回的值将为NULLSELECT UNIX_TIMESTAMP(ADDDATE(NOW(), INTERVAL 19 YEAR))

这里有什么问题?会不会是整数溢出?我该怎么解决呢?

我使用的是以下MariaDB版本:ver15.1要闻10.4.7-MariaDB,用于Linux (x86_64),使用readline5.1

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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作为存储类型。

代码语言:javascript
复制
SELECT ADDDATE(NOW(), INTERVAL 19 YEAR)  -- DATETIME
-- 2038-09-07 18:42:39
票数 3
EN

Stack Overflow用户

发布于 2021-12-26 12:45:22

正如我在上面的评论中指出的那样,我无法让它工作通过2038年“启示录”的日期限制,甚至不能将字段转换为日期时间。可能还有其他因素影响到这一最终解决办法。

我能找到的唯一解决办法是从PHP获取DB中的日期,并使用strtotime() PHP函数从其中获取UNIX时间戳。

代码语言:javascript
复制
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

代码语言:javascript
复制
date("U",strtotime($php_array[0][thedatefield]))

PHP ()函数凭借"U“标志将DB输出转换为UNIX时间戳,而不受32位2038 Epochalipse限制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57836038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档