Saya mencoba mendapatkan jumlah hari antara dua tanggal yang berbeda, kecuali akhir pekan.
Saya tidak tahu bagaimana mencapai hasil ini.
postgresql
datetime
pragati basa
sumber
sumber
Jawaban:
Dengan asumsi bahwa dengan "akhir pekan" yang Anda maksud adalah hari Sabtu dan Minggu , ini bisa menjadi lebih sederhana:
Anda tidak perlu level subquery tambahan untuk
generate_series()
. SRF (atur fungsi pengembalian), juga disebut sebagai "fungsi tabel", dapat digunakan seperti tabel dalamFROM
klausa.Perhatikan khususnya yang
generate_series()
menyertakan batas atas dalam output, selama interval penuh (parameter ke-3) cocok. Batas atas hanya dikecualikan jika interval terakhir akan terpotong, yang tidak demikian halnya dengan hari penuh.Dengan pola
ISODOW
untuk EXTRACT () , hari Minggu dilaporkan sebagai7
, sesuai dengan standar ISO. Memungkinkan untukWHERE
kondisi yang lebih sederhana .Lebih baik panggil
generate_series()
dengantimestamp
input. Inilah alasannya:count(*)
sedikit lebih pendek dan lebih cepat daripadacount(the_day)
, melakukan hal yang sama dalam hal ini.Untuk mengecualikan batas bawah dan / atau atas, tambahkan / kurangi sesuai 1 hari. Biasanya, Anda dapat menyertakan yang lebih rendah dan mengecualikan batas atas:
sumber
Contoh ini menyebutkan semua tanggal antara 2013-12-15 dan 2014-01-02 (inklusif). Kolom kedua memberikan hari dalam seminggu (secara numerik, antara 0 dan 6). Kolom ketiga menandai apakah hari dalam seminggu adalah hari Sabtu / Minggu atau tidak (Anda harus menyesuaikan apa yang Anda anggap sebagai akhir pekan) dan apa yang dapat digunakan untuk menghitung hari kerja.
sumber
Dengan asumsi bahwa akhir pekan adalah hari Sabtu dan Minggu, Anda dapat menggunakan SQL berikut.
Ganti tanggal dengan pilihan Anda dan (0,6) dengan hari-hari dalam minggu yang ingin Anda kecualikan.
Beberapa hal yang perlu Anda perhatikan: -
Anda belum menyebutkan versi PostgreSQL apa yang Anda jalankan. Ini berfungsi pada 9.1+ tetapi harus bekerja pada versi yang lebih rendah.
Tanggal yang dipilih inklusif saat menggunakan generate_series. Jadi, jika Anda ingin berhari-hari, tambahkan 1 hari untuk setiap tanggal.
sumber
Ada beberapa hal yang dapat Anda lakukan untuk mempermudah ini. Metode yang akan saya gunakan adalah memastikan bahwa daftar tanggal tersedia. Anda dapat dengan cepat membuat yang seperti ini:
Setelah tabel dibuat, Anda harus dapat mengisinya dengan data tanggal yang relatif cepat.
Anda kemudian dapat menulis kueri Anda sebagai penghitungan cepat catatan dari tabel ini.
sumber
Saya menyarankan Anda untuk membuat fungsi untuk digunakan kapan pun Anda mau dan menulis lebih sedikit; )
Kode di atas akan membuat fungsi sql yang menghitung dan mengembalikan jumlah hari akhir pekan (Sabtu, Minggu). Hanya dengan cara ini Anda akan memiliki lebih banyak fleksibilitas untuk menggunakan fungsi ini.
Setelah itu, Anda dapat menggunakan fungsi ini untuk mengembalikan hanya jumlah hari akhir pekan dalam interval. Inilah contoh untuk digunakan:
Pilih ini harus mengembalikan empat karena hari pertama dan kedua adalah Senin, dan kami memiliki 2 Sabtu dan 2 Minggu di antara mereka.
Sekarang, untuk mengembalikan hanya hari kerja (tanpa akhir pekan), seperti yang Anda inginkan , cukup kurangi, seperti contoh di bawah ini:
sumber
sumber