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
datestyle
så 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.