Tuesday, September 1, 2009

generate time/date table Oracle

/* BEST way to generate date list as 1 column of dates between inputs */
WITH DATES AS
 (SELECT TO_DATE(NVL('&begin_dt'
                    ,SYSDATE - 365)
                ,'DD-MON-YY') BEGIN_DT
        ,TO_DATE(NVL('&end_dt'
                    ,SYSDATE)
                ,'DD-MON-YY') END_DT
  FROM DUAL)

SELECT BEGIN_DT + (LEVEL - 1) DT FROM DATES CONNECT BY LEVEL <= (END_DT + 1) - BEGIN_DT


/*two other ways: */
select to_char(x.lvl, 'HH24') || ':00:00'
from ( SELECT sysdate - (level/24) lvl
FROM dual
CONNECT BY LEVEL <= 24 ) x
order by 1

select to_char(x.lvl, 'YYYY-MM-DD')
from ( SELECT sysdate - level lvl
FROM dual
CONNECT BY LEVEL <= 30) x

/*Create a time dim for every second of the day in a few easy steps: */

create table DWPRD.Time_Dim as

WITH timegen AS ((SELECT to_char(trunc(sysdate) + (level/86400),'HH24:MI:SS') lvl_sort, trunc(sysdate) + (level/86400) lvl FROM dual CONNECT BY LEVEL <= 86400) order by 1)

SELECT ROWNUM TIME_KEY, b.* FROM (
SELECT to_char(lvl, 'HH12:MI:SS AM') TIME_STANDARD, to_char(lvl, 'HH24:MI:SS') TIME_MILITARY, to_char(lvl, 'HH12') HOUR_STANDARD, to_char(lvl, 'HH24') HOUR_MILITARY, to_char(lvl, 'MI') MINUTE, to_char(lvl, 'SS') SECOND,
to_char(lvl,'AM') as AM_PM,
case WHEN to_char(lvl, 'HH24') BETWEEN '08' AND '16' THEN 'Y' ELSE 'N' END AS IN_GENERAL_BUSINESS_HOURS_FLAG

FROM TIMEgen ) b

No comments:

Post a Comment