Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

PL/SQL (किसी भी वर्ष की किसी तिमाही के पहले और अंतिम दिन की गणना कैसे करें)

मुझे यह प्रश्न बहुत भ्रमित करने वाला लगता है। अगर असली सवाल यह है कि मनमाने DATE . की तिमाही की गणना कैसे करें तो पहले से ही बहुत सारे उदाहरण हैं, जैसे:

मनमानी तिथि की तिमाही की गणना कैसे करें

परीक्षण के लिए कुछ तिथियां:

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

क्वार्टर खोजें:

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;

परिणाम:

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
...

एक PL/SQL प्रक्रिया जो तिमाही के पहले और अंतिम दिन लौटाती है

वर्ष के भाग को छोड़कर सभी वर्षों के लिए तिमाही की शुरुआत और समाप्ति तिथियां स्थिर हैं। अर्थात। दूसरी तिमाही हमेशा 1 अप्रैल से शुरू होती है और हर साल 30 जून को समाप्त होती है। इस प्रकार दिन और महीना तय किया जा सकता है और केवल वर्ष के हिस्से को समायोजित करना होगा।

एक फ़ंक्शन केवल एक मान लौटा सकता है, इसलिए सबरूटीन को इसके बजाय प्रक्रिया के रूप में लागू किया जाता है। मैंने प्रक्रिया के लिए एक फ़ंक्शन रैपर भी प्रदान किया:

-- 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

ऊपर दिए गए सबरूटीन्स का उपयोग कैसे करें:

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. Oracle के साथ काम करते समय Fluent NHibernate के साथ बैच लाने को कैसे कार्यान्वित करें?

  2. Oracle 11g बाइंड चर मौजूद नहीं है

  3. टाइमस्टैम्प से समय घटाने के लिए Oracle SQL क्वेरी

  4. जावा जेडीबीसी के माध्यम से आईबीएटीआईएस का उपयोग कर ओरेकल एसक्यूएल दिनांक रूपांतरण समस्या

  5. IN बनाम OR Oracle, कौन सा तेज़?