Masalah:
Anda ingin mengelompokkan record berdasarkan bulan dalam database PostgreSQL.
Contoh:
Basis data kami memiliki tabel bernama watch
dengan data pada kolom id
, name
, dan production_timestamp
.
id | nama | stempel waktu_produksi |
---|---|---|
1 | tonton | 01-03-2019 11:45:23 |
2 | jam tangan pintar | 15-09-2019 07:35:13 |
3 | smartband | 22-09-2019 17:22:05 |
Solusi:
Anda dapat menggunakan DATE_TRUNC()
berfungsi untuk mengelompokkan record dalam tabel berdasarkan bulan.
Inilah kueri yang akan Anda tulis:
SELECT DATE_TRUNC('month',production_timestamp) AS production_to_month, COUNT(id) AS count FROM watch GROUP BY DATE_TRUNC('month',production_timestamp);
Berikut hasil querynya:
production_to_month | hitung |
---|---|
01-03-2019 00:00:00 | 1 |
01-09-2019 00:00:00 | 2 |
Diskusi:
Gunakan DATE_TRUNC()
fungsi jika Anda ingin mengambil tanggal atau waktu dengan presisi tertentu dari database PostgreSQL. (Dalam contoh kami, kami menggunakan presisi bulan.)
Fungsi ini membutuhkan dua argumen. Pertama, kami memiliki penentu bagian tanggal (dalam contoh kami, 'bulan'). Perhatikan bahwa specifier adalah string dan harus diapit tanda kutip.
Argumen kedua adalah nilai timestamp; ini bisa berupa ekspresi yang mengembalikan nilai stempel waktu atau nama kolom stempel waktu. (Dalam contoh kami, kami menggunakan kolom production_timestamp
).
Fungsi DATE_TRUNC()
memotong stempel waktu ke presisi yang diberikan (dalam hal ini, bulan). Dalam database kami, jam tangan pintar memiliki tanggal produksi 2019-09-15 07:35:13
; setelah dipotong menjadi presisi bulan, menjadi 2019-09-01 00:00:00
. Presisi tingkat bulan menyebabkan hari ditampilkan sebagai '01' dan waktu diisi dengan nol. (Bagian tanggal yang terpotong (misalnya hari, bulan) dari stempel waktu diganti dengan yang.)
Mengelompokkan catatan berdasarkan bulan sangat umum di PostgreSQL. Dalam contoh kita, jumlah produk dijumlahkan untuk setiap bulan. (COUNT()
fungsi agregat menghitung jumlah produk). Jika Anda mengelompokkan rekaman menggunakan fungsi agregat, Anda harus menggunakan klausa GROUP BY. Setelah klausa GROUP BY, Anda harus menempatkan kolom atau ekspresi yang digunakan dengan fungsi agregat dalam pernyataan SELECT. (Dalam contoh kita, ini adalah DATE_TRUNC( 'month', production_timestamp)
.)
Tentu saja, Anda tidak perlu menggunakan DATE_TRUNC()
berfungsi hanya untuk mengelompokkan record. Anda juga dapat menggunakannya untuk mendapatkan hari pertama setiap bulan untuk tanggal tertentu.
Untuk setiap jam tangan, dapatkan presisi nama dan tanggal produksi hingga bulan – tidak perlu pengelompokan. Inilah kueri yang akan Anda tulis:
SELECT name, DATE_TRUNC('month',production_timestamp) AS production_to_month FROM watch;
Ini hasilnya:
nama | production_to_month |
---|---|
tonton | 01-03-2019 00:00:00 |
jam tangan pintar | 01-09-2019 00:00:00 |
smartband | 01-09-2019 00:00:00 |
Dalam kueri ini, fungsi DATE_TRUNC()
memotong stempel waktu ke presisi bulan. Dalam database kami, jam tangan pintar memiliki tanggal produksi '2019-09-15 07:35:13'
; sekarang '2019-09-01 00:00:00'
, yang merupakan hari pertama bulan itu.