在Postgresql中将Python序数日期转换为普通日期

4 投票
3 回答
2476 浏览
提问于 2025-04-16 01:12

有没有办法把一个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函数的更多信息...

PostgreSQL的二进制时间戳函数

UDF项目及其在C语言中为PostgreSQL的实现

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)));

撰写回答