【问题标题】:Unix time stamp conversion is different in Mysql and OracleUnix时间戳转换在Mysql和Oracle中是不同的
【发布时间】:2019-04-16 12:23:01
【问题描述】:

Unix 时间戳转换在 mysql 和 oracle 中给出不同的结果

select FROM_UNIXTIME(1387444958) from dual;

输出:2013-12-19 10:22:38

select to_char(to_date('01/01/1970 00:00:00','DD/MM/YYYY HH24:MI:SS')+ (1387444958/86400),'YYYY-MM-DD HH24:MI:SS')from dual;

输出:2013-12-19 09:22:38

谁能帮我从 oracle 获取与我在 MySql 中获取相同的时间戳。

【问题讨论】:

  • oracle服务器在哪里?在实行有效 DST 的国家/地区?
  • 看起来您的一个数据库正在运行英国夏令时间(或您在当地应用的任何夏令时变体),而不是 UTC。

标签: mysql oracle


【解决方案1】:

Unix 时间戳是距离1970-01-01 00:00:00 UTC 的秒数,这实际上是您本地时区(或 MySQL 服务器所在的时区)中的 1970-01-01 01:00:00。看起来FROM_UNIXTIME 考虑到了这一点。

对于 Oracle,您可以使用此功能:

FUNCTION UnixTime2Timestamp(UnixTime IN NUMBER) RETURN TIMESTAMP IS
BEGIN
    RETURN (TIMESTAMP '1970-01-01 00:00:00 UTC' + UnixTime * INTERVAL '1' SECOND) AT LOCAL;
END UnixTime2Timestamp;

我假设如果您想在 MySQL 中获取 UTC 时间,那么您必须运行

select 
   CONVERT_TZ(FROM_UNIXTIME(1387444958),'{your local timezone}','UTC') 
from dual;

【讨论】:

  • 为什么不INTERVAL UnixTime SECOND
  • @SalmanA,它必须是文字,变量是不可能的。 NUMTODSINTERVAL(UnixTime , 'second') 也可以。
  • @WernfriedDomscheit 添加间隔是解决目的,但我只想知道两个数据库中时间戳存在差异的原因。
  • 密钥是AT LOCAL。它将 UTC 时间转换为您当前的会话时区。 FROM_UNIXTIME 在内部执行此操作。
猜你喜欢
  • 2013-04-15
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
相关资源
最近更新 更多