Du förväntade dig 1-01-01 ... 1-12-31
... men hur ska PostgreSQL veta vad du menar med det?
Inmatningssträngsliteralerna tolkas enligt inställningarna för din nuvarande session (som är standardinställningarna i postgressql.conf
om det inte åsidosätts). I synnerhet datestyle
:
DateStyle
(string
)Ställer in visningsformatet för datum- och tidsvärden, samt reglerna för tolkning av tvetydiga datuminmatningsvärden. Av historiska skäl innehåller denna variabel två oberoende komponenter:utdataformatspecifikationen (
ISO
,Postgres
,SQL
, ellerGerman
) och in-/utgångsspecifikationen för beställning av år/månad/dag (DMY
,MDY
, ellerYMD
). Dessa kan ställas in separat eller tillsammans. NyckelordenEuro
ochEuropean
är synonymer tillDMY
; nyckelordenUS
,NonEuro
, ochNonEuropean
är synonymer tillMDY
. Se Avsnitt 8.5 för mer information. Den inbyggda standarden ärISO, MDY
, men initdb kommer att initiera konfigurationsfilen med en inställning som motsvarar beteendet för den valdalc_time
språk.
(Medan utdataformatet mestadels bestäms av lc_time
.)
I ditt fall, den stympade tidsstämpeln bokstavlig 1-12-31 23:59:59
tolkas uppenbarligen som:
D-MM-YY h24:mi:ss
Medan du skulle ha hoppats på:
Y-MM-DD h24:mi:ss
3 alternativ
-
Ställ in
datestyle
så att den tolkar bokstavliga ord på samma sätt som du gör. KanskeISO, YMD
? -
Använd
to_timestamp()
att tolka strängen bokstavligt på ett väldefinierat sätt - oberoende av andra inställningar. Mycket bättre.SELECT to_timestamp('1-12-31 23:59:59', 'Y-MM-DD h24:mi:ss');
-
Ännu bättre, använd ISO 8601-formatet (
YYYY-MM-DD
) för alla datetime literals. Det är otvetydigt och oberoende av alla inställningar .SELECT '2001-12-31 23:59:59'::timestamp;
Skriv om frågan
Din fråga är felaktig till att börja med. Hantera intervallfrågor på olika sätt. Gilla:
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;
Eller ännu enklare:
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;
Områdestyper i PostgreSQL 9.2 eller senare kan vara av intresse.