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

PL / SQL (Cách tính ngày đầu tiên và ngày cuối cùng của bất kỳ quý nào trong năm)

Tôi thấy câu hỏi này rất khó hiểu. Nếu câu hỏi thực sự là làm thế nào để tính một phần tư của DATE tùy ý thì đã có rất nhiều ví dụ, như:

Cách tính phần tư của một ngày tùy ý

Một số ngày thử nghiệm:

create table lots_of_dates as
select trunc(sysdate - level * 7) as d
from dual
connect by level <= 52;

Tìm phần tư:

select d,
       to_char(d, 'YYYY-Q') as QUARTER,
       trunc(d, 'Q') as Q_FIRST_DAY,
       add_months(trunc(d, 'Q'), 3) - 1 as Q_LAST_DAY
from lots_of_dates
order by 1;

Kết quả:

D                  QUARTE Q_FIRST_DAY        Q_LAST_DAY
------------------ ------ ------------------ ------------------
02-SEP-12          2012-3 01-JUL-12          30-SEP-12
09-SEP-12          2012-3 01-JUL-12          30-SEP-12
16-SEP-12          2012-3 01-JUL-12          30-SEP-12
23-SEP-12          2012-3 01-JUL-12          30-SEP-12
30-SEP-12          2012-3 01-JUL-12          30-SEP-12
07-OCT-12          2012-4 01-OCT-12          31-DEC-12
14-OCT-12          2012-4 01-OCT-12          31-DEC-12
21-OCT-12          2012-4 01-OCT-12          31-DEC-12
28-OCT-12          2012-4 01-OCT-12          31-DEC-12
04-NOV-12          2012-4 01-OCT-12          31-DEC-12
11-NOV-12          2012-4 01-OCT-12          31-DEC-12
...

Thủ tục PL / SQL trả về ngày đầu tiên và ngày cuối cùng của quý

Ngày bắt đầu và ngày kết thúc của quý không đổi cho tất cả các năm ngoại trừ phần năm. I E. quý II luôn bắt đầu vào ngày 1 tháng 4 và kết thúc vào ngày 30 tháng 6 hàng năm. Do đó, ngày và tháng có thể được cố định và chỉ phần năm phải được điều chỉnh.

Một hàm chỉ có thể trả về một giá trị nên thay vào đó, chương trình con được thực hiện như một thủ tục. Tôi cũng đã cung cấp một trình bao bọc hàm cho thủ tục:

-- raises CASE_NOT_FOUND for non-existing quarters
create or replace procedure get_quarter_days(
  p_year in number,
  p_quarter in number,
  p_first_day out date,
  p_last_day out date
) deterministic as
begin
  case p_quarter
    when 1 then
      p_first_day := to_date(p_year || '-01-01', 'YYYY-MM-DD');
      p_last_day  := to_date(p_year || '-03-31', 'YYYY-MM-DD');
    when 2 then
      p_first_day := to_date(p_year || '-04-01', 'YYYY-MM-DD');
      p_last_day  := to_date(p_year || '-06-30', 'YYYY-MM-DD');
    when 3 then
      p_first_day := to_date(p_year || '-07-01', 'YYYY-MM-DD');
      p_last_day  := to_date(p_year || '-09-30', 'YYYY-MM-DD');
    when 4 then
      p_first_day := to_date(p_year || '-10-01', 'YYYY-MM-DD');
      p_last_day  := to_date(p_year || '-12-31', 'YYYY-MM-DD');
  end case;
end;
/
show errors

create or replace function get_quarter_first_day(
  p_year in number,
  p_quarter in number
) return date deterministic as
  v_first_day date;
  v_last_day date;
begin
  get_quarter_days(p_year, p_quarter, v_first_day, v_last_day);
  return v_first_day;
end;
/
show errors

create or replace function get_quarter_last_day(
  p_year in number,
  p_quarter in number
) return date deterministic as
  v_first_day date;
  v_last_day date;
begin
  get_quarter_days(p_year, p_quarter, v_first_day, v_last_day);
  return v_last_day;
end;
/
show errors

Cách sử dụng các chương trình con ở trên:

declare
  v_first_day date;
  v_last_day date;
begin
  get_quarter_days(2011, 1, v_first_day, v_last_day);
  dbms_output.put_line(v_first_day || ' - ' || v_last_day);
  get_quarter_days(2012, 2, v_first_day, v_last_day);
  dbms_output.put_line(v_first_day || ' - ' || v_last_day);
  get_quarter_days(2013, 3, v_first_day, v_last_day);
  dbms_output.put_line(v_first_day || ' - ' || v_last_day);
  get_quarter_days(2014, 4, v_first_day, v_last_day);
  dbms_output.put_line(v_first_day || ' - ' || v_last_day);

  dbms_output.put_line(get_quarter_first_day(2015, 1) || ' - ' ||
                       get_quarter_last_day(2015, 1));
end;
/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xóa các tệp khỏi một thư mục trong quy trình được lưu trữ oracle

  2. Di chuyển Cơ sở dữ liệu Oracle từ AWS EC2 sang AWS RDS, Phần 2

  3. Ví dụ SQL động Oracle để chèn bản ghi bằng DBMS_SQL

  4. Con trỏ tham chiếu bị mất trong XMLType.createxml

  5. đã thực thi một thủ tục được lưu trữ oracle từ máy chủ sql bằng cách sử dụng hàm truy vấn mở