Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle SQL - dapatkan jumlah hari antara dua tanggal untuk bulan tertentu

Februari bukan bulan, itu adalah nama generik dari bulan dalam setahun. "Bulan" dalam arti yang tepat adalah Februari 2016, atau Februari 2017 dll. Berdasarkan output yang Anda inginkan, saya berasumsi maksud Anda Februari 2016.

Masalahnya sepele. Bagaimanapun Anda menentukan bulannya, Anda dapat mengidentifikasi hari pertama dan terakhir bulan itu. Misalnya, jika Anda memasukkan bulan sebagai string enam karakter:input = '201602' , maka Anda dapat menggunakan sesuatu seperti

to_date(input, 'yyyymm')                as month_start, 
last_day(to_date(input, 'yyyymm'))      as month_end

lalu hitung jumlah hari seperti ini:

Persiapan (dalam SQLPlus):

SQL> variable input varchar2(30)
SQL> exec :input := '201602';

PL/SQL procedure successfully completed.

SQL> alter session set nls_date_format = 'dd/mm/yyyy';

Kueri :

with
     test_dates ( datefrom, dateto ) as (
       select to_date('28/1/2016', 'dd/mm/yyyy'), to_date('15/2/2016', 'dd/mm/yyyy') from dual union all
       select to_date('10/2/2016', 'dd/mm/yyyy'), to_date('3/3/2016' , 'dd/mm/yyyy') from dual union all
       select to_date('5/2/2016' , 'dd/mm/yyyy'), to_date('16/2/2016', 'dd/mm/yyyy') from dual union all
       select to_date('20/1/2016', 'dd/mm/yyyy'), to_date('10/3/2016', 'dd/mm/yyyy') from dual
     )
--  end of test data; solution (SQL query) begins below this line
select t.datefrom, t.dateto, to_char(to_date(:input, 'yyyymm'), 'MON yyyy') as month,
       case when t.datefrom > m.month_end or t.dateto < m.month_start then 0
            else least(t.dateto, m.month_end) - greatest(t.datefrom, m.month_start) + 1
            end as number_of_days
from   test_dates t cross join 
                  ( select to_date(:input, 'yyyymm') as month_start,
                           last_day(to_date(:input, 'yyyymm')) as month_end 
                    from   dual) m
;

Keluaran :(Catatan:angka dalam "keluaran yang diinginkan" salah)

DATEFROM   DATETO     MONTH    NUMBER_OF_DAYS
---------- ---------- -------- --------------
28/01/2016 15/02/2016 FEB 2016             15
10/02/2016 03/03/2016 FEB 2016             20
05/02/2016 16/02/2016 FEB 2016             12
20/01/2016 10/03/2016 FEB 2016             29

4 rows selected.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bug Oracle saat menambahkan kolom yang tidak dapat dibatalkan dengan default

  2. Menggunakan Nama Layanan Oracle dengan SQLAlchemy

  3. ORA-30926:tidak bisa mendapatkan set baris yang stabil di tabel sumber

  4. Bagaimana cara menggunakan Parameter Array/Tabel ke Oracle (ODP.NET 10g) melalui ADO.NET/C#?

  5. Lewati Objek sebagai parameter input ke prosedur tersimpan dengan node-Oracledb di node js