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

Mendapatkan jumlah hari tertentu dalam seminggu (akhir pekan) dari interval di PostgreSQL

Fungsi berikut mengembalikan jumlah hari akhir pekan penuh antara dua tanggal. Saat Anda membutuhkan hari penuh, Anda dapat memberikan stempel waktu ke tanggal sebelum memanggil fungsi. Ini mengembalikan 0 jika kencan pertama tidak sepenuhnya sebelum yang kedua.

CREATE FUNCTION count_full_weekend_days(date, date)
  RETURNS int AS
$BODY$
  SELECT
    ($1 < $2)::int
      *
    (
      (($2 - $1) / 7) * 2
        + 
      (EXTRACT(dow FROM $1)<6 AND EXTRACT(dow FROM $2)>0 AND EXTRACT(dow FROM $1)>EXTRACT(dow FROM $2))::int * 2
        +
      (EXTRACT(dow FROM $1)=6 AND EXTRACT(dow FROM $2)>0)::int
        +
      (EXTRACT(dow FROM $2)=0 AND EXTRACT(dow FROM $1)<6)::int
    );
$BODY$
  LANGUAGE 'SQL' IMMUTABLE STRICT;

Contoh:

SELECT COUNT_FULL_WEEKEND_DAYS('2009-04-10', '2009-04-20');
# returns 4

SELECT COUNT_FULL_WEEKEND_DAYS('2009-04-11', '2009-04-20');
# returns 3 (11th is Saturday, so it shouldn't be counted as full day)

SELECT COUNT_FULL_WEEKEND_DAYS('2009-04-12', '2009-04-20');
# returns 2 (12th is Sunday, so it shouldn't be counted as full day)

SELECT COUNT_FULL_WEEKEND_DAYS('2009-04-13', '2009-04-20');
# returns 2

Untuk mendapatkan jumlah hari kecuali hari akhir pekan penuh, cukup kurangi jumlah hari dari fungsi di atas:

SELECT
  '2009-04-20'::date
    -
  '2009-04-13'::date
    -
   COUNT_FULL_WEEKEND_DAYS('2009-04-13', '2009-04-20');


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cara mengubah urutan kolom

  2. Cara membagi array menjadi baris di Postgresql

  3. Bagaimana saya bisa melakukan pencarian tidak sensitif aksen di Postgres 8.3.x dengan DB di utf-8?

  4. Mengembalikan nilai individu nol dengan postgres tablefunc crosstab()

  5. Bagaimana Anda mengatasi batasan ukuran Docker.qcow2 di Docker untuk Mac?