有没有办法将6位数的序数日期(自公元0001年1月1日以来的天数)转换为Postgres的正常时间戳?使用python的datetime.toordinal()创建日期。
例如,
>>> date = datetime.date(2010, 7, 20)
>>> datetime.toordinal(date)
733973
我需要的是在Postgres中将'733973'转换回'2010-07-20'。
谢谢!
答案 0 :(得分:2)
在PostgreSQL 8.4中我正在使用:
to_date(2455452::text, 'J')
上面的'0000-12-31'::日期技巧达到了PG 8.3,但是PG 8.4产生了上述错误(我相信更高)。 PG 8.4还要求to_date(text,text)的两个参数都是text类型,这就是将Julian日期值转换为文本的原因。
答案 1 :(得分:1)
这是我首先想到的:
select date (date '0000-12-31' + interval '733973 days');
>> "2010-07-20"
或
select date (date '0000-12-31' + interval '1 days' * 733973);
>> "2010-07-20"
它只是添加了日期0000-12-31
的天数。它不使用日期0001-01-01
,因为此日期datetime.toordinal()
被定义为1
,因此-1偏移。
<强> date.fromordinal(有序)强>
返回对应于公历格里高利序数的日期,其中 1年1月1日有序数1 ...
如果日期0000-31-12
未被识别为有效日期,您可以轻松地将语句更改为:
select date (date '0001-01-01' + interval '733973 days' - interval '1 day');
或
select date (date '0001-01-01' + (interval '1 days' * (733973 - 1)));
答案 2 :(得分:0)
这个怎么样?
http://doxygen.postgresql.org/backend_2utils_2adt_2timestamp_8c-source.html
看看第01416行:
j2date((int) date, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
更多关于j2date函数...