nataraj: (Бритый небритый)
[personal profile] nataraj
create table test (d date);
postgres=# insert into test values ('5874897-01-01'::date);
INSERT 0 1
postgres=# insert into test values ('5874897-01-01'::date - '1D'::interval);
ERROR:  date out of range for timestamp
STATEMENT:  insert into test values ('5874897-01-01'::date - '1D'::interval);
ERROR:  date out of range for timestamp

Date: 2016-01-29 06:44 am (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner
Не воспроизводится. Структуру таблицы покажи.

Date: 2016-01-29 06:45 am (UTC)
ext_613079: Default userpic (Бритый небритый)
From: [identity profile] shaplov.livejournal.com
create table test (d date);

Date: 2016-01-29 06:53 am (UTC)
vitus_wagner: My photo 2005 (white)
From: [personal profile] vitus_wagner
А. понятно. Это date, а не timestamp. У timestamp интервал меньше чем у date значит.А операции с интервалами производятся путем приведения к timestamp.

А я сразу создал тестовую таблицу с полем timestamp и получил консистентный результат - везде out of range,
Edited Date: 2016-01-29 06:54 am (UTC)

Date: 2016-01-29 06:57 am (UTC)
ext_613079: Default userpic (Бритый небритый)
From: [identity profile] shaplov.livejournal.com
Ну почему оно так -- примерно понятно.

А вот должно ли оно быть так -- вопрос отдельный...

Потому как один день в современных датах вычитают именно так, и не парятся,
то что кто-то захочет вычитать дни на пределами 295го века -- это крайне сомнительно. Но все равно как-то неаккуратненько получается...

Date: 2016-01-29 07:00 am (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner
Документированная фича

- date '2001-09-28' - interval '1 hour' timestamp '2001-09-27 23:00:00'
.

Для того, чтобы поддержать весь диапазон типа date в операциях с интервалами, нужно завести отдельный тип dayinterval с гранулярностью в днях. Чтобы его прибавление-отнимание к дате никогда не могло породить времени, отличного от полуночи.

А пока придется оперировать с integer-ами - числом дней. Не слишком удобно, конечно, так как месяцы и годы придется по формуле Цольнера руками пересчитывать.
Edited Date: 2016-01-29 07:06 am (UTC)

Date: 2016-01-29 07:58 am (UTC)
From: [identity profile] astarsan.livejournal.com
если у тебя дата и надо дни вычитать - вычитай int(дни) а не interval.

Date: 2016-01-29 06:54 am (UTC)
ext_613079: Default userpic (Бритый небритый)
From: [identity profile] shaplov.livejournal.com
И абстрактный вопрос. В документации

http://www.postgresql.org/docs/current/static/datatype-datetime.html

Есть ли смысл прописать очные минимальные и максимальные значения. Потому что date по факту имеет минимальное значение 4714-11-24 BC а не просто заявленное 4713 BC

Date: 2016-01-29 07:03 am (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner
НУ типа "если не будешь использовать даты ранее 4713, все будет работать". А крохоборничать и говорить, что еще поддерживается декабрь месяц 4714 и 6 дней ноября того же года - ну зачем?

Date: 2016-01-29 07:12 am (UTC)
ext_613079: Default userpic (Бритый небритый)
From: [identity profile] shaplov.livejournal.com
А фактическое максимальное значение оказалось 5876265-12-16 против 5874897 заявленного в документации...
5876265-12-16
5874897

1368 лет разницы, однако :-))

Date: 2016-01-29 07:15 am (UTC)
ext_613079: Default userpic (Бритый небритый)
From: [identity profile] shaplov.livejournal.com
Ой, нет, блин, там все куда интереснее!!!!

Date: 2016-01-29 07:18 am (UTC)
ext_613079: Default userpic (Бритый небритый)
From: [identity profile] shaplov.livejournal.com
postgres=# insert into test values ('5874897-01-01'::date + 1000000000);
INSERT 0 1
postgres=# select * from test order by d;
d
---------------
8612804-01-05
(1 row)

postgres=# insert into test values ('8612804-01-05');
ERROR: date out of range: "8612804-01-05" at character 26
STATEMENT: insert into test values ('8612804-01-05');
ERROR: date out of range: "8612804-01-05"
LINE 1: insert into test values ('8612804-01-05');

Date: 2016-01-29 07:22 am (UTC)
ext_613079: Default userpic (Бритый небритый)
From: [identity profile] shaplov.livejournal.com
А если добавить еще больше, то происходит переход в прошлое

postgres=# insert into test values ('5874897-01-01'::date + 2147483647);
INSERT 0 1
postgres=# select * from test order by d;
d
---------------
4715-06-22 BC
(1 row)

Date: 2016-01-29 07:40 am (UTC)
vitus_wagner: My photo 2005 (white)
From: [personal profile] vitus_wagner
А вот это, похоже, уже надо репортить.

Date: 2016-01-29 07:59 am (UTC)
From: [identity profile] astarsan.livejournal.com
Маньяки блин :). Но в общем да согласен что баг (хотя и некритичный).

Profile

nataraj: (Default)
Swami Dhyan Nataraj

July 2024

S M T W T F S
 123456
789 10111213
14151617181920
21222324252627
28293031   

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 20th, 2026 06:50 am
Powered by Dreamwidth Studios