Очаквахте 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 или по-нова може да представляват интерес.