在Postgresql中将python序数日期转换为正常日期

时间:2010-07-13 07:44:50

标签: python postgresql date

有没有办法将6位数的序数日期(自公元0001年1月1日以来的天数)转换为Postgres的正常时间戳?使用python的datetime.toordinal()创建日期。

例如,

>>> date = datetime.date(2010, 7, 20)
>>> datetime.toordinal(date)
733973

我需要的是在Postgres中将'733973'转换回'2010-07-20'。

谢谢!

3 个答案:

答案 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偏移。

来自python docs

  

<强> 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函数...

PostgreSQL binary timestamp functions

Project of UDF and its realization at C for PostgreSQL