Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle SQL - lấy số ngày giữa hai ngày trong một tháng cụ thể

Tháng Hai không phải là một tháng, nó là tên chung của một tháng trong năm. "Tháng" theo đúng nghĩa là tháng 2 năm 2016 hoặc tháng 2 năm 2017, v.v. Dựa trên kết quả mong muốn của bạn, tôi cho rằng ý bạn là tháng 2 năm 2016.

Vấn đề là tầm thường. Tuy nhiên bạn xác định tháng, bạn có thể xác định ngày đầu tiên và ngày cuối cùng của tháng. Ví dụ:nếu bạn nhập tháng dưới dạng chuỗi sáu ký tự:input = '201602' , sau đó bạn có thể sử dụng một cái gì đó như

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

và sau đó tính toán số ngày như sau:

Chuẩn bị (trong 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';

Truy vấn :

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
;

Đầu ra :(Lưu ý:các số trong "đầu ra mong muốn" của bạn không chính xác)

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. Làm thế nào để kiểm tra một Thủ tục được Lưu trữ trong Oracle với kiểu trả về RefCursor?

  2. Oracle PL / SQL:loại bỏ các ký tự khoảng trắng khỏi một chuỗi

  3. Sử dụng chuỗi trong thủ tục lưu trữ Oracle

  4. tìm các số còn thiếu từ chuỗi sau khi nhận được chuỗi từ một chuỗi?

  5. oracle chuyển đổi DD-MON-YY thành DD / MM / YYYY