S
Simple calendar for whole year usable month by month.
SELECT TO_NUMBER(SUBSTR(x.week, 3)) AS week, x.month, MAX(DECODE(TO_CHAR(x.day, 'D'), '1', TO_NUMBER(TO_CHAR(x.day, 'FMDD')))) AS mon, MAX(DECODE(TO_CHAR(x.day, 'D'), '2', TO_NUMBER(TO_CHAR(x.day, 'FMDD')))) AS tue, MAX(DECODE(TO_CHAR(x.day, 'D'), '3', TO_NUMBER(TO_CHAR(x.day, 'FMDD')))) AS wed, MAX(DECODE(TO_CHAR(x.day, 'D'), '4', TO_NUMBER(TO_CHAR(x.day, 'FMDD')))) AS thu, MAX(DECODE(TO_CHAR(x.day, 'D'), '5', TO_NUMBER(TO_CHAR(x.day, 'FMDD')))) AS fri, MAX(DECODE(TO_CHAR(x.day, 'D'), '6', TO_NUMBER(TO_CHAR(x.day, 'FMDD')))) AS sat, MAX(DECODE(TO_CHAR(x.day, 'D'), '7', TO_NUMBER(TO_CHAR(x.day, 'FMDD')))) AS sun FROM ( SELECT TRUNC(SYSDATE, 'Y') + LEVEL - 1 AS day, TO_CHAR(TRUNC(SYSDATE, 'Y') + LEVEL - 1, 'IYIW') AS week, TO_CHAR(TRUNC(SYSDATE, 'Y') + LEVEL - 1, 'MM/YYYY') AS month FROM DUAL CONNECT BY LEVEL <= ADD_MONTHS(TRUNC(SYSDATE, 'Y'), 12) - TRUNC(SYSDATE, 'Y') ) x GROUP BY x.month, x.week ORDER BY x.month, x.week;
You can calculate next day and also next business day (if you apply function above):
DECLARE in_date CONSTANT DATE := TRUNC(SYSDATE); -- FUNCTION next_date ( in_day CHAR, in_date DATE := TRUNC(SYSDATE) ) RETURN DATE AS BEGIN RETURN CASE in_day WHEN 'D' THEN in_date + 1 WHEN 'W' THEN NEXT_DAY(in_date, TO_CHAR(TRUNC(in_date, 'D'), 'DY')) WHEN 'M' THEN LAST_DAY(in_date) + 1 WHEN 'Q' THEN CASE WHEN EXTRACT(MONTH FROM in_date) MOD 3 = 0 THEN TRUNC(ADD_MONTHS(in_date, 1), 'MM') ELSE TRUNC(ADD_MONTHS(in_date, (3 - (EXTRACT(MONTH FROM in_date) MOD 3)) + 1), 'MM') END WHEN 'Y' THEN TO_DATE((EXTRACT(YEAR FROM in_date) + 1) || '-01-01', 'YYYY-MM-DD') END; END; BEGIN -- show next day, week (Monday), quarter, year and number of days left FOR c IN ( SELECT 'D' AS day_ FROM DUAL UNION ALL SELECT 'W' FROM DUAL UNION ALL SELECT 'M' FROM DUAL UNION ALL SELECT 'Q' FROM DUAL UNION ALL SELECT 'Y' FROM DUAL ) LOOP DBMS_OUTPUT.PUT_LINE(c.day_ || ' ' || TO_CHAR(next_date(c.day_, in_date), 'YYYY-MM-DD') || ' ' || LPAD(next_date(c.day_, in_date) - TRUNC(SYSDATE), 4)); END LOOP; END; /
On a related note, you can set default NLS parameters for your session.
BEGIN DBMS_SESSION.SET_NLS('NLS_LANGUAGE', '''CZECH'''); DBMS_SESSION.SET_NLS('NLS_TERRITORY', '''CZECH REPUBLIC'''); DBMS_SESSION.SET_NLS('NLS_DATE_FORMAT', '''DD.MM.RR'''); DBMS_SESSION.SET_NLS('NLS_TIME_FORMAT', '''HH24:MI:SSXFF'''); DBMS_SESSION.SET_NLS('NLS_TIMESTAMP_FORMAT', '''DD.MM.RR HH24:MI:SSXFF'''); END; /
Comments
Post a Comment