Конвертировать порядковый номер Python в обычную дату в Postgresql - PullRequest
4 голосов
/ 13 июля 2010

Есть ли способ преобразовать 6-значную порядковую дату (дни с 1 января 0001 г. н.э.) в обычную метку времени в Postgres?Дата создается с помощью python datetime.toordinal ().

Например,

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

Мне нужно преобразовать 733973 обратно в 2010-07-20 в Postgres.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 06 мая 2012

В PostgreSQL 8.4 я использую:

to_date(2455452::text, 'J')

Приведенный выше трюк '0000-12-31' :: date работал до PG 8.3, но выдает упомянутую ошибку с PG 8.4 (и, я думаю, выше). PG 8.4 также требует, чтобы оба аргумента to_date (text, text) имели тип text, и это причина преобразования значений даты в юлианском формате в текст.

1 голос
/ 13 июля 2010

Вот что мне пришло в голову:

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 (порядковый номер)
Возвращает дату, соответствующую пропелептическому григорианскому порядковому номеру, где 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)));
0 голосов
/ 13 июля 2010

Как насчет этого?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...