PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL:между с дата и час

Очаквахте 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 опции

  1. Задайте datestyle така че да тълкува литералите по същия начин като вас. Може би ISO, YMD ?

  2. Използвайте to_timestamp() да интерпретира низовия литерал по добре дефиниран начин - независимо от други настройки. Много по-добре.

     SELECT to_timestamp('1-12-31 23:59:59', 'Y-MM-DD h24:mi:ss');
    
  3. Още по-добре, използвайте формат 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 или по-нова може да представляват интерес.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Проблеми с командата postgresql COPY с Rails на различен сървър

  2. Разлика между времеви отпечатъци с/без часова зона в PostgreSQL

  3. psql:ФАТАЛНО:Удостоверяването на идентификатор не бе успешно за потребител postgres

  4. Преобразувайте екранизирания символ на Unicode обратно в действителен знак в PostgreSQL

  5. Надграждане на PostgreSQL 11 до PostgreSQL 13 с TimescaleDB и PostGIS в Linux с помощта на pg_upgrade