PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL:antara dengan datetime

Anda mengharapkan 1-01-01 ... 1-12-31 ... tapi bagaimana PostgreSQL bisa tahu apa yang Anda maksud dengan itu?

Literal string input ditafsirkan sesuai dengan pengaturan sesi Anda saat ini (yang defaultnya adalah pengaturan umum di postgressql.conf kecuali ditolak). Khususnya datestyle :

DateStyle (string )

Mengatur format tampilan untuk nilai tanggal dan waktu, serta aturan untuk menafsirkan nilai input tanggal yang ambigu. Untuk alasan historis, variabel ini berisi dua komponen independen:spesifikasi format keluaran (ISO , Postgres , SQL , atau German ) dan spesifikasi input/output untuk pemesanan tahun/bulan/hari (DMY , MDY ,atau YMD ). Ini dapat diatur secara terpisah atau bersama-sama. Kata kunciEuro dan European adalah sinonim untuk DMY; kata kunci US ,NonEuro , dan NonEuropean adalah sinonim untuk MDY . Lihat Bagian8.5 untuk informasi lebih lanjut. Default bawaan adalah ISO, MDY , tetapi initdb akan menginisialisasi file konfigurasi dengan pengaturan yang sesuai dengan perilaku lc_time yang dipilih lokal.

(Sementara format output sebagian besar ditentukan oleh lc_time .)

Dalam kasus Anda, stempel waktu yang dimutilasi 1-12-31 23:59:59 jelas diartikan sebagai:

D-MM-YY h24:mi:ss

Meskipun Anda mengharapkan:

Y-MM-DD h24:mi:ss

3 opsi

  1. Setel datestyle sehingga menafsirkan literal dengan cara yang sama seperti yang Anda lakukan. Mungkin ISO, YMD ?

  2. Gunakan to_timestamp() untuk menafsirkan string literal dengan cara yang terdefinisi dengan baik - terlepas dari pengaturan lain. Jauh lebih baik.

     SELECT to_timestamp('1-12-31 23:59:59', 'Y-MM-DD h24:mi:ss');
    
  3. Lebih baik lagi, gunakan format ISO 8601 (YYYY-MM-DD ) untuk semua literal datetime. Itu jelas dan independen dari setelan apa pun .

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

Tulis ulang kueri

Permintaan Anda salah untuk memulai. Tangani kueri rentang secara berbeda. Seperti:

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;

Atau, lebih sederhana lagi:

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;

Jenis rentang di PostgreSQL 9.2 atau yang lebih baru mungkin menarik.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Permintaan untuk elemen array di kolom JSON

  2. Pola &Pengubah Template untuk Pemformatan Numerik di PostgreSQL

  3. Migrasi Rails:mencoba mengubah jenis kolom dari string menjadi integer

  4. Transaksi Otonom di PostgreSQL 9.1

  5. pg_ctl Tips dan Trik