sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL:mellem med datetime

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

  1. Indstil datestyle så den fortolker bogstavelige ord på samme måde som du gør. Måske ISO, YMD ?

  2. 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');
    
  3. 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.



  1. få nyt SQL record ID

  2. Postgres:vælg summen af ​​værdier, og summer dette igen

  3. SQL, hvordan man bruger SELECT

  4. Opsætning af et udviklingsmiljø for at lære PL/SQL