MySQL日期格式转换 13位时间戳转YYYY-MM-DD的三种方案

直接使用 DATE_FORMAT(FROM_UNIXTIME(ts/1 000), '%Y-%m-%d') 将时间戳转换为当前日期的毫秒数。
ts 是一个 1 3 位时间戳字段,单位为毫秒。
除以 1 000 转秒即可将 FROM_UNIXTIME 转换为当前日期。
DATE_FORMAT 以固定格式输出。
例如,ts=1 6 7 0000000000,结果为2 02 3 -03 -07
使用 DATE(FROM_UNIXTIME(ts/1 000)) 更容易。
仅获取日期部分,自动采用 YYYY-MM-DD 格式。
例如,ts=1 6 7 0000000000,结果为2 02 3 -03 -07
使用 CAST(FROM_UNIXTIME(ts/1 000) AS DATE) 显式转换类型。
适合与其他日期字段一起使用。
例如,ts=1 6 7 0000000000,结果为2 02 3 -03 -07
注意:1 3 位时间戳存储在BIGINT中,否则INT会溢出。
INT 最大只有 2 1 4 .7 4 8 .3 6 4 7 ,1 3 位是不够的。
直接转换为 DATETIME 会丢失毫秒,使用 DATETIME(3 ) 来保留毫秒。

我忘记更改时差,FROM_UNIXTIME 使用服务器的时区。
使用 CONVERT_TZ 将 UTC 转换为本地时间,例如 +00:00 到 +08 :00。
选择 CONVERT_TZ(FROM_UNIXTIME(ts/1 000), '+00:00', '+08 :00') AS local_time。

自己掂量一下。

mysql中怎么把时间戳转换成正常时间

嘿,两天前我帮同事转换了一份报告。
时间戳显示了一长串数字,特别难看。
他们的表存储了 UNIX 时间戳,长达数千秒,就像从天堂读取的一样。
我只是想知道,这个可以直接转换为SQL中常见的日期格式吗?
我尝试了FROM_UNIXTIME函数,嘿,它确实有效。
在MySQL中写入SELECT FROM_UNIXTIME(your_timestamp_column),数字就会立即出现,如年、月、日。
例如,有一个名为 log_time 的字段,它存储 UNIX 时间戳。
我直接使用 SELECT FROM_UNIXTIME(log_time) AS Readable_time FROM logs,结果的格式为 2 02 3 -05 -2 6 1 4 :3 0:00。

最有趣的是这个功能相当灵活。
有同事说有时候只需要年月日,不需要时分秒,于是我加了参数,写了 SELECT FROM_UNIXTIME(your_timestamp_column, '%Y-%m-%d') AS formatted_date FROM logs,结果只显示2 02 3 -05 -2 6 他还说有时候报表需要显示时分秒,我改成'%Y-%m-%d %H:%i:%s',然后就显示所有的时间了。

等一下,我突然想到,这个函数也可以处理负时间戳吗?这是表示 1 9 7 0 年 1 月 1 日之前时间的类型。
我记得从 1 9 7 0 年开始计算 UNIX 时间戳。
那么负数呢?试试这个...好吧,我在MySQL中尝试了SELECT FROM_UNIXTIME(-1 00000),它实际上显示了1 9 6 9 -1 2 -3 1 1 6 :4 0:00。
它确实有效。
看来这个功能还蛮靠谱的。

但是,使用后我有点困惑。
直接存储时间为什么 MySQL 不使用自己的时间类型,如 TIMESTAMP 或 DATETIME?您需要保存一长串秒数吗?是为了兼容一些旧系统还是为了节省存储空间?等等,还有一件事,如果时间戳超出了 UNIX 时间戳可以表示的范围,例如几千年后,这个函数会发生什么?

MySQL时间戳转换技巧 详解13位时间戳转日期格式的实现方法

上周尝试了这种 MySQL 转换。

迄今为止的 1 3 位毫秒时间戳。
首先除以 1 000。

然后 FROM_UNIXTIME()。
例如: 广场 SELECT FROM_UNIXTIME(1 2 3 4 5 6 7 8 9 01 2 3 /1 000) AS 日期时间
如果要自定义格式,请添加 DATE_FORMAT()。
例如: 广场 选择 DATE_FORMAT(FROM_UNIXTIME(1 2 3 4 5 6 7 8 9 01 2 3 /1 000), '%Y-%m-%d %H:%i:%s') AS 格式
2 02 3 年使用 %Y,每月使用 %m,每天使用 %d。

有时字段类型是错误的。
例如,它是 VARCHAR。
那么你必须先使用CAST来投射它。
广场 选择 FROM_UNIXTIME(CAST('1 2 3 4 5 6 7 8 9 01 2 3 ' AS 未注册) / 1 000)
NULL 值处理。
广场 选择 IFNULL(FROM_UNIXTIME(ts / 1 000), '1 9 7 0-01 -01 ')
时区是一个陷阱。
默认为服务器时区。
你必须注意。

应检查无效的时间戳。
我不知道如何过滤这部分。
想点别的事吧。
如果数据量很大。
函数查询会很慢。
最好建立一个索引。

或者提前转账保存。
或者使用应用层转换。
忘了它。