在Postgresql中将Python序数日期转换为普通日期
有没有办法把一个6位数的序数日期(从公元1年1月1日开始的天数)转换成普通的时间戳,在Postgres中使用?这个日期是用Python的datetime.toordinal()生成的。
举个例子,
>>> date = datetime.date(2010, 7, 20)
>>> datetime.toordinal(date)
733973
我需要把'733973'转换回'2010-07-20'在Postgres中。
谢谢!
3 个回答
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函数的更多信息...
2
在PostgreSQL 8.4中,我使用了:
to_date(2455452::text, 'J')
之前在PG 8.3中可以用的'0000-12-31'::date这个方法,在PG 8.4中就出错了(我觉得更高版本也会出错)。PG 8.4还要求to_date(text, text)这个函数的两个参数都得是文本类型,所以我需要把朱利安日期的值转换成文本。
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文档
date.fromordinal(ordinal)
返回对应于公历序数的日期,其中年份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)));