【问题标题】:How to write bigint (timestamp in milliseconds) value as timestamp in postgresql如何在postgresql中将bigint(以毫秒为单位的时间戳)值写入时间戳
【发布时间】:2014-07-19 22:38:55
【问题描述】:

我正在尝试将我的值存储在带有时区字段的时间戳中。从 1970 年开始以毫秒为单位。

select TO_CHAR(TO_TIMESTAMP(1401432881230), 'DD/MM/YYYY HH24:MI:SS.MS')

预期为30/5/2014 11:29:42 10:54:41.230,但得到 22/08/46379 23:27:02.000

【问题讨论】:

  • select TO_CHAR(TO_TIMESTAMP(1401432881222 / 1000), 'DD/MM/YYYY HH24:MI:SS') || '.' || (1401432881222%1000) 是好的查询方式吗?返回30/05/2014 06:54:41.222
  • to_timestamp 已经考虑了毫秒,这就是它接受浮点 unix 时间戳的原因。如果要存储真正的时间戳,只需存储它返回的内容。如果要格式化,使用MS显示毫秒。
  • 但在我的例子中(select TO_CHAR(TO_TIMESTAMP(1401432881230), 'DD/MM/YYYY HH24:MI:SS.MS'))我按照你说的做。

标签: postgresql timestamp unix-timestamp milliseconds bigint


【解决方案1】:

Unix timestamps 用秒来衡量时间,而不是毫秒(几乎无处不在,在 PostgreSQL 中也是如此)。

因此你需要调用

SELECT TO_TIMESTAMP(1401432881230 / 1000);

如果您想保留毫秒,请拨打double precision

SELECT TO_TIMESTAMP(1401432881230::double precision / 1000);

【讨论】:

  • 如果你愿意,你也可以写 TO_TIMESTAMP(1401432881230 / 1000.0) 来代替显式转换。
【解决方案2】:

这就是我将毫秒转换为时间戳并保留毫秒而不是秒的方式。接受的答案将丢弃毫秒。

WITH ts AS (SELECT 1401432881230 AS ts)
SELECT to_timestamp(ts / 1000) + ((ts % 1000 ) || ' milliseconds') :: INTERVAL
FROM ts;

-- FOR ALTER COLUMN
ALTER TABLE  my_info
  ALTER COLUMN tstmp TYPE TIMESTAMP USING to_timestamp(tstmp / 1000) + ((tstmp % 1000) || ' milliseconds') :: INTERVAL;

【讨论】:

    【解决方案3】:

    好的,我明白了。我的 INSERT 应该是这样的:

    INSERT INTO events (timestamp) VALUES (to_timestamp(TO_CHAR(TO_TIMESTAMP(1401432881222 / 1000), 'YYYY-MM-DD HH24:MI:SS') || '.' || (1401432881222%1000), 'YYYY-MM-DD HH24:MI:SS.MS'))

    我正在将毫秒的 bigint-timestamp 转换为所需格式的文本 ('YYYY-MM-DD HH24:MI:SS.MS') 并将其传递给 to_timestamp 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 2016-09-05
      • 2021-08-20
      • 2023-03-11
      • 2015-06-17
      • 1970-01-01
      • 2020-02-22
      相关资源
      最近更新 更多