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

Bagaimana cara menghitung hari kecuali hari Minggu antara dua tanggal di Postgres?

Anda perlu mendefinisikan "antara dua tanggal" lebih dekat. Batas bawah dan atas disertakan atau dikecualikan? Definisi umum adalah menyertakan bagian bawah dan mengecualikan batas atas suatu interval. Plus, tentukan hasilnya sebagai 0 ketika batas bawah dan atas identik. Definisi ini kebetulan bertepatan dengan pengurangan tanggal tepatnya .

SELECT date '2017-01-31' - date '2017-01-01' AS days_between

Definisi yang tepat ini penting untuk mengecualikan hari Minggu. Untuk definisi yang diberikan interval dari Matahari - Matahari (1 minggu kemudian) tidak termasuk batas atas, jadi hanya ada 1 Minggu untuk dikurangi.

interval in days  | sundays
0                 | 0
1-6               | 0 or 1
7                 | 1
8-13              | 1 or 2
14                | 2
...

Interval 7 hari selalu mencakup tepat satu hari Minggu.

Kita bisa mendapatkan hasil minimum dengan pembagian bilangan bulat biasa (hari / 7 ), yang memotong hasilnya.

Minggu ekstra untuk sisa 1 - 6 hari tergantung pada hari pertama interval. Jika ini hari Minggu, bingo; kalau hari senin, sayang sekali. Dll. Kita dapat memperoleh rumus sederhana dari ini:

SELECT days, sundays, days - sundays AS days_without_sundays
FROM  (
   SELECT z - a AS days
      , ((z - a) + EXTRACT(isodow FROM a)::int - 1 ) / 7 AS sundays
   FROM  (SELECT date '2017-01-02' AS a       -- your interval here
               , date '2017-01-30' AS z) tbl
   ) sub;

Bekerja untuk apa saja interval yang diberikan.
Catatan:isodow , bukan dow untuk EXTRACT() .

Untuk menyertakan batas atas, ganti saja z - a dengan (z - a) + 1 . (Akan berfungsi tanpa tanda kurung, karena prioritas operator, tetapi lebih baik jelas.)

Karakteristik kinerja adalah O(1) (konstanta) sebagai lawan dari agregat bersyarat di atas set yang dihasilkan dengan O(N) .

Terkait:

  • Bagaimana cara menentukan hari terakhir bulan sebelumnya menggunakan PostgreSQL?
  • Menghitung jam kerja antara 2 tanggal di PostgreSQL


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kombinasi kueri dengan array catatan bersarang dalam tipe data JSON

  2. Gunakan \copy psql untuk kueri multi-baris

  3. Apakah Postgres mendukung transaksi bersarang atau otonom?

  4. Membuat kata sandi pengguna postgresql

  5. Dapatkan Id dari INSERT bersyarat