Du forventede 1-01-01 ... 1-12-31 ... men hvordan skal PostgreSQL vide, hvad du mener med det?
Input strengliteral fortolkes i overensstemmelse med indstillingerne for din aktuelle session (som som standard er generelle indstillinger i postgressql.conf medmindre den tilsidesættes). Især datestyle :
DateStyle (string )
Indstiller visningsformatet for dato- og tidsværdier samt reglerne for fortolkning af tvetydige datoinputværdier. Af historiske årsager indeholder denne variabel to uafhængige komponenter:outputformatspecifikationen (ISO , Postgres , SQL , eller German ) og input/output-specifikationen for bestilling af år/måned/dag (DMY , MDY eller YMD ). Disse kan indstilles separat eller sammen. NøgleordeneEuro og European er synonymer for DMY; søgeordene US ,NonEuro og NonEuropean er synonymer for MDY . Se Afsnit 8.5 for mere information. Den indbyggede standard er ISO, MDY , men initdb vil initialisere konfigurationsfilen med en indstilling, der svarer til adfærden for den valgte lc_time landestandard.
(Mens outputformatet for det meste bestemmes af lc_time .)
I dit tilfælde er det lemlæstede tidsstempel bogstaveligt 1-12-31 23:59:59 tolkes åbenbart som:
D-MM-YY h24:mi:ss
Mens du ville have håbet på:
Y-MM-DD h24:mi:ss
3 muligheder
-
Indstil
datestyleså den fortolker bogstavelige ord på samme måde som du gør. MåskeISO, YMD? -
Brug
to_timestamp()at fortolke strengen bogstaveligt på en veldefineret måde - uafhængigt af andre indstillinger. Meget bedre.SELECT to_timestamp('1-12-31 23:59:59', 'Y-MM-DD h24:mi:ss'); -
Endnu bedre, brug ISO 8601-formatet (
YYYY-MM-DD) for alle bogstaver for dato og klokkeslæt. Det er utvetydigt og uafhængigt af alle indstillinger .SELECT '2001-12-31 23:59:59'::timestamp;
Omskriv forespørgsel
Din forespørgsel er defekt til at begynde med. Håndter rækkeviddeforespørgsler anderledes. Ligesom:
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 endnu enklere:
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ådetyper i PostgreSQL 9.2 eller nyere kan være af interesse.