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
, atauGerman
) dan spesifikasi input/output untuk pemesanan tahun/bulan/hari (DMY
,MDY
,atauYMD
). Ini dapat diatur secara terpisah atau bersama-sama. Kata kunciEuro
danEuropean
adalah sinonim untukDMY
; kata kunciUS
,NonEuro
, danNonEuropean
adalah sinonim untukMDY
. Lihat Bagian8.5 untuk informasi lebih lanjut. Default bawaan adalahISO, MDY
, tetapi initdb akan menginisialisasi file konfigurasi dengan pengaturan yang sesuai dengan perilakulc_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
-
Setel
datestyle
sehingga menafsirkan literal dengan cara yang sama seperti yang Anda lakukan. MungkinISO, YMD
? -
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');
-
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.