PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL:pomiędzy z datetime

Oczekiwałeś 1-01-01 ... 1-12-31 ... ale skąd PostgreSQL ma wiedzieć, co przez to rozumiesz?

Literały ciągu wejściowego są interpretowane zgodnie z ustawieniami bieżącej sesji (które domyślnie są ustawieniami ogólnymi w postgressql.conf chyba że zostanie unieważniony). W szczególności datestyle :

DateStyle (string )

Ustawia format wyświetlania wartości daty i godziny, a także zasady interpretacji niejednoznacznych wartości wejściowych daty. Ze względów historycznych ta zmienna zawiera dwa niezależne składniki:specyfikację formatu wyjściowego (ISO , Postgres , SQL lub German ) oraz specyfikację wejścia/wyjścia dla zamawiania rok/miesiąc/dzień (DMY , MDY lub YMD ). Można je ustawić osobno lub razem. Słowa kluczoweEuro i European są synonimami DMY; słowa kluczowe US ,NonEuro i NonEuropean są synonimami MDY . Zobacz Sekcję8.5 po więcej informacji. Wbudowana wartość domyślna to ISO, MDY , ale initdb zainicjuje plik konfiguracyjny z ustawieniem odpowiadającym zachowaniu wybranego lc_time lokalizacja.

(Podczas gdy format wyjściowy jest określany głównie przez lc_time .)

W twoim przypadku, literal sygnatury czasowej, który został uszkodzony 1-12-31 23:59:59 jest oczywiście interpretowane jako:

D-MM-YY h24:mi:ss

Chociaż byś liczył na:

Y-MM-DD h24:mi:ss

3 opcje

  1. Ustaw datestyle aby interpretował literały w taki sam sposób jak ty. Może ISO, YMD ?

  2. Użyj to_timestamp() interpretować literał ciągu w dobrze zdefiniowany sposób - niezależnie od innych ustawień. Znacznie lepiej.

     SELECT to_timestamp('1-12-31 23:59:59', 'Y-MM-DD h24:mi:ss');
    
  3. Jeszcze lepiej, użyj formatu ISO 8601 (YYYY-MM-DD ) dla wszystkich literałów daty i godziny. To jest jednoznaczne i niezależne od jakichkolwiek ustawień .

     SELECT '2001-12-31 23:59:59'::timestamp;
    

Przepisz zapytanie

Twoje zapytanie jest na początku błędne. Obsługuj zapytania o zakres w inny sposób. Na przykład:

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;

Lub jeszcze prościej:

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;

Typy zakresów w PostgreSQL 9.2 lub nowszych mogą być interesujące.



  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 - maksymalna liczba parametrów w klauzuli IN?

  2. Systemy plików Linux i testy punktów kontrolnych PostgreSQL

  3. Aktualizacja wierszy bazy danych bez blokowania tabeli w PostgreSQL 9.2

  4. Korzystanie z klauzuli EXCEPT w PostgreSQL

  5. Narzędzie do tłumaczenia Oracle PL/SQL na Postgresql PL/pgSQL