在 Sql 中将 Bigint 数据转换为人类可读的日期时间

Convert Bigint data to human readable date-time in Sql

我创建了一个 MySql table 并使用以下代码在其中提供数据

CREATE TABLE IF NOT EXISTS DB (
    INN VARCHAR(200) NOT NULL, 
    Time BIGINT not NULL
);

现在我想要一个 table,它将在按 INN 分组时报告 Time 的最大值和最小值。下面是我的代码 -

SELECT INN, from_unixtime(MIN(Time)), from_unixtime(MAX(Time)) FROM DB GROUP BY INN

我想要将 Time 值报告为 正常日期时间 而不是大纪元时间。但是使用上面的代码,我得到了 <NA> 个值。

典型的 Time 值类似于 1546380001264082944

有人可以帮助我获得正确的代码来实现相同的目的吗?

这里的问题与您使用的 unix 时间戳的精度有关。

考虑一下:

SELECT FROM_UNIXTIME(1546380001), FROM_UNIXTIME(1546380001264082944)

输出为:

2019-01-01T22:00:01Z    (null)

您拥有的 timestampt 值 1546380001264082944 包含超出 MySQL 接受的精度级别。

FROM_UNIXTIME的定义是:

FROM_UNIXTIME(unix_timestamp[,format])

文档指出:

unix_timestamp is an internal timestamp value representing seconds since '1970-01-01 00:00:00' UTC

您的时间戳精度明显高于自 Unix 纪元以来的秒数。

文档可用 here

1546380001264082944太大了,不能是纪元秒甚至毫秒。通过将此值放在 https://currentmillis.com/.

上可以轻松验证这一点

您已将精度存储到纳秒级。因此,在将列值传递给 from_unixtime.

之前,将列值除以 1e9
SELECT INN, from_unixtime(MIN(Time) / 1000000000), from_unixtime(MAX(Time) / 1000000000)
FROM DB
GROUP BY INN