在 PostgreSQL 中将 Julian 日期转换为时间戳

Posted

技术标签:

【中文标题】在 PostgreSQL 中将 Julian 日期转换为时间戳【英文标题】:Convert Julian Date to Timestamp in PostgreSQL 【发布时间】:2019-07-23 12:31:51 【问题描述】:

我有一张充满“朱利安日期”的表格,即距离 2035 年 1 月 1 日 的天数和秒数。我需要将这些转换为普通的 postgres 时间戳。有人可以帮忙吗?

--Converts '2000-06-20 12:30:15' into an Epoch time base which gives a result of -12612.478993055556
select (EXTRACT(epoch FROM ('2000-06-20 12:30:15'::timestamp - '2035-01-01 00:00:00'))/86400.00) as run_ts

--Question, how to convert -12612.478993055556 back into '2000-06-20 12:30:15'
select -12612.478993055556 ??? as run_ts

【问题讨论】:

如果-12612.478993055556 确实是一个“纪元”,它需要导致1969-12-31 21:29:47.521,因为“纪元”是自1970-01-01 00:00:00 以来的秒数 是的,同意,我应该澄清这不是真正的时代,因此我很痛苦:( 【参考方案1】:

您可以使用to_timestamp() 将纪元转换为时间戳。

您发布的纪元与 2000-06-20 不对应,因为您从中删除了另一个日期 2035-01-01。

select (EXTRACT(epoch FROM ('2000-06-20 12:30:15'::timestamp )));
 date_part
-----------
 961504215
(1 row)

select to_timestamp(961504215);
      to_timestamp
------------------------
 2000-06-20 08:30:15-04
(1 row)


select to_timestamp(-12612.478993055556);
         to_timestamp
-------------------------------
 1969-12-31 15:29:47.521007-05
(1 row)

编辑

由于您考虑的不是真正的纪元,而是两个日期之间的差异,您可以简单地将这个差异添加到参考日期。您可以使用day 间隔来消除乘以 86400(秒/天)的需要

select  '2035-01-01 00:00:00'::timestamp + interval '1' day *  -12612.478993055556;
      ?column?
---------------------
 2000-06-20 12:30:15

【讨论】:

是的,我应该澄清一下,有问题的日期非常重要。包含此信息的数据平台决定 2035-01-01 是测量的日期和真实的日期,因此它不是真实的纪元时间,因此是我的问题。我目前正在使用您的解决方案尝试在使用 to_timestamp 后解决这个问题:) 谢谢@JGH 这正是我所需要的,我基本上尝试过但失败了。不错!

以上是关于在 PostgreSQL 中将 Julian 日期转换为时间戳的主要内容,如果未能解决你的问题,请参考以下文章

SQL - 日期存储为 varchar 但格式化为 Julian Date

R语言日期函数weekdays, months, quarters & julian实战(星期几那个月那个季度时间差)

如何在雪花日期数据类型字段中插入儒略日期

在 PostgreSQL 中将数据类型“Varchar”更改为“TimeStamp”

postgresql 将数字转换为日期和格式

将时间戳与查询中的日期名称相等,并在 PostgreSQL 查询中获取结果集 w.r.t 日期名称