You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中无法将Epoch时间-28800000转换为标准时间求助

解决MySQL转换1970年前Epoch时间的问题

问题根源

MySQL的FROM_UNIXTIME()函数仅支持1970-01-01 00:00:00 UTC之后的UNIX时间戳(即数值≥0),对于小于0的时间戳会直接返回NULL,这就是你尝试方法a、b失败的原因。而方法c通过DATE_ADD从UTC起始时间计算的思路是可行的,但返回的是UTC时间,需要进一步转换为新加坡时区(GMT+08:00)。

通用解决方案

使用CASE语句做条件判断,区分1970年前后的时间戳分别处理,既兼容正常记录,又能解决1970年前时间的转换:

基础转换(带时区)

SELECT 
  CASE 
    WHEN epoch_col >= 0 THEN 
      CONVERT_TZ(FROM_UNIXTIME(epoch_col / 1000), '+00:00', '+08:00')
    ELSE 
      CONVERT_TZ(
        DATE_ADD('1970-01-01 00:00:00', INTERVAL (epoch_col / 1000) SECOND),
        '+00:00',
        '+08:00'
      )
  END AS converted_time
FROM your_table;

格式化输出(如YYYY-MM-DD HH:mm:ss)

SELECT 
  CASE 
    WHEN epoch_col >= 0 THEN 
      DATE_FORMAT(CONVERT_TZ(FROM_UNIXTIME(epoch_col / 1000), '+00:00', '+08:00'), '%Y-%m-%d %H:%i:%s')
    ELSE 
      DATE_FORMAT(
        CONVERT_TZ(
          DATE_ADD('1970-01-01 00:00:00', INTERVAL (epoch_col / 1000) SECOND),
          '+00:00',
          '+08:00'
        ),
        '%Y-%m-%d %H:%i:%s'
      )
  END AS converted_time
FROM your_table;

说明

  • 替换epoch_col为你表中的Epoch时间字段名,your_table为表名。
  • 如果依赖系统时区(已设置为新加坡时间),可以将'+08:00'替换为'SYSTEM',但直接写时区偏移更稳定,避免系统时区变更影响结果。
  • 针对你提供的-28800000毫秒值,转换后得到的新加坡时区时间为1970-01-01 00:00:00,若和你在线查询结果不符,需确认Epoch值是否正确(注:-28800000毫秒等于-8小时,对应UTC时间为1969-12-31 16:00,加8小时后为新加坡时间1970-01-01 00:00)。

内容的提问来源于stack exchange,提问作者wokalap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 10:12:42