Очаквахте 1-01-01 ... 1-12-31
... но как PostgreSQL трябва да разбере какво имаш предвид с това?
Литералите на входния низ се интерпретират според настройките на текущата ви сесия (които по подразбиране са общи настройки в postgressql.conf
освен ако не бъде отменено). По-специално datestyle
:
DateStyle
(string
)Задава формата на показване на стойностите за дата и час, както и правилата за интерпретиране на нееднозначни стойности за въвеждане на дата. По исторически причини тази променлива съдържа два независими компонента:спецификация на изходния формат (
ISO
,Postgres
,SQL
, илиGerman
) и спецификацията на входа/изхода за поръчка на година/месец/ден (DMY
,MDY
, илиYMD
). Те могат да се задават поотделно или заедно. Ключовите думиEuro
иEuropean
са синоними наDMY
; ключовите думиUS
,NonEuro
иNonEuropean
са синоними наMDY
. Вижте Раздел 8.5 за повече информация. Вграденото по подразбиране еISO, MDY
, но initdb ще инициализира конфигурационния файл с настройка, която съответства на поведението на избранияlc_time
локал.
(Докато изходният формат се определя най-вече от lc_time
.)
Във вашия случай, обезобразеният литерал на времевата марка 1-12-31 23:59:59
очевидно се тълкува като:
D-MM-YY h24:mi:ss
Докато бихте се надявали на:
Y-MM-DD h24:mi:ss
3 опции
-
Задайте
datestyle
така че да тълкува литералите по същия начин като вас. Може биISO, YMD
? -
Използвайте
to_timestamp()
да интерпретира низовия литерал по добре дефиниран начин - независимо от други настройки. Много по-добре.SELECT to_timestamp('1-12-31 23:59:59', 'Y-MM-DD h24:mi:ss');
-
Още по-добре, използвайте формат ISO 8601 (
YYYY-MM-DD
) за всички литерали за дата и време. Това е недвусмислено и независимо от всякакви настройки .SELECT '2001-12-31 23:59:59'::timestamp;
Пренаписване на заявка
Запитването ви е неправилно отначало. Обработвайте заявките за диапазон по различен начин. Като:
SELECT d.given_on
FROM documents_document d
WHERE EXTRACT('month' FROM d.given_on) = 1
AND d.given_on >= '2001-01-01 0:0'
AND d.given_on < '2002-01-01 0:0'
ORDER BY d.created_on DESC;
Или още по-просто:
SELECT d.given_on
FROM documents_document d
WHERE d.given_on >= '2001-01-01 0:0'
AND d.given_on < '2001-02-01 0:0'
ORDER BY d.created_on DESC;
Типовете диапазони в PostgreSQL 9.2 или по-нова може да представляват интерес.