我想从1995年1月1日到2023年12月31日加载数据。这是正确的语法。目前,在以下查询的帮助下,我只有3年的数据(1096条记录)。
CREATE TABLE "DATE_DIM"
( "DATE_KEY" NUMBER(10,0) CONSTRAINT "NN_DATE_KEY" NOT NULL ENABLE,
"DATE_VALUE" DATE,
"DATE_DAY_OF_WEEK" NUMBER,
"DATE_DAY_OF_WEEK_NAME" VARCHAR2(10 BYTE),
"DATE_WEEKEND_FLAG" NUMBER,
"DATE_WEEK_IN_MONTH" NUMBER,
"DATE_WEEK_IN_YEAR" NUMBER,
"DATE_WEEK_START_DATE" DATE,
"DATE_WEEK_END_DATE" DATE,
"DATE_DAY_OF_MONTH" NUMBER,
"DATE_MONTH_START_DATE" DATE,
"DATE_MONTH_NUMBER" VARCHAR2(2 BYTE),
"DATE_MONTH_NAME" VARCHAR2(10 BYTE),
"DATE_MONTH_ABBR" VARCHAR2(3 BYTE),
"DATE_QUARTER_NUMBER" VARCHAR2(1 BYTE),
"DATE_QUARTER_NAME" VARCHAR2(2 BYTE),
"DATE_QUARTER" VARCHAR2(8 BYTE),
"DATE_FISCAL_YEAR" VARCHAR2(4 BYTE),
"DATE_DAY_OF_YEAR_NUMBER" NUMBER,
"DATE_DAYS_IN_YEAR" NUMBER,
"DATE_HOLIDAY_IND" VARCHAR2(1 BYTE),
CONSTRAINT "PK_DATE_DIM" PRIMARY KEY ("DATE_KEY");
INSERT INTO date_dim
SELECT TO_NUMBER (TO_CHAR (mydate, 'yyyymmdd')) AS date_key,
TO_CHAR (mydate, 'dd-MON-yyyy') AS date_value,
TO_NUMBER (TO_CHAR (mydate, 'D')) AS date_day_of_week,
TO_CHAR (mydate, 'Day') AS date_day_of_week_name,
CASE WHEN TO_NUMBER (TO_CHAR (mydate, 'D')) IN (1, 7) THEN 1
ELSE 0
END AS date_weekend_flag,
TO_NUMBER (TO_CHAR (mydate, 'W')) AS date_week_in_month,
TO_NUMBER (TO_CHAR (mydate, 'WW')) AS date_week_in_year,
TRUNC(mydate, 'w') AS date_week_start_date,
TRUNC(mydate, 'w') + 7 - 1/864 AS date_week_end_date,
TO_NUMBER (TO_CHAR (mydate, 'DD')) AS date_day_of_month,
to_date(to_char(mydate,'MM') || '01' || to_char(mydate,'YYYY'),'MMDDYYYY') AS date_Month_START_DATE,
TO_CHAR (mydate, 'MM') AS date_month_number,
TO_CHAR (mydate, 'Month') AS date_month_name,
TO_CHAR (mydate, 'MON') AS date_month_abbr,
TO_CHAR (mydate, 'Q') AS date_quarter_number,
'Q' || TO_CHAR (mydate, 'Q') AS date_quarter_name,
'Q'
|| UPPER(TO_CHAR(mydate,'Q')
|| '-'
|| TO_CHAR(mydate,'YYYY')) AS date_quarter,
TO_CHAR (mydate, 'yyyy') AS date_fiscal_year,
TO_NUMBER (TO_CHAR (mydate, 'DDD')) AS date_day_of_year_number,
ADD_MONTHS (TRUNC (mydate, 'Y'), 12) - TRUNC (mydate, 'Y') AS date_days_in_year,
' ' as DATE_HOLIDAY_FLAG
FROM ( SELECT TRUNC (ADD_MONTHS (SYSDATE, -12), 'yy') - 1 + LEVEL AS mydate
FROM dual
CONNECT BY LEVEL <= (SELECT TRUNC (ADD_MONTHS (SYSDATE, 24), 'yy')
- TRUNC (ADD_MONTHS (SYSDATE, -12), 'yy')
FROM DUAL
)
);
答案 0 :(得分:2)
我假设您真的在询问connect by
的内部选择。对于那些固定日期(仅涵盖29年,没有?),您可以使用:
FROM ( SELECT DATE '1995-01-01' - 1 + LEVEL AS mydate
FROM dual
CONNECT BY LEVEL <= (DATE '2024-01-01' - DATE '1995-01-01')
)
...生成10592条记录,涵盖01-JAN-95至31-DEC-23。
我不确定你为什么要存储这么多重复的东西,并且可以动态计算(例如,一年中的几天),我会考虑将它作为一个视图而不是一个表 - 特别是如果事实证明你需要一个滚动的窗口 - 但你需要考虑我想的表现。
这很奇怪:
TO_CHAR (mydate, 'dd-MON-yyyy') AS date_value,
我的表格DATE_VALUE
列为DATE
类型,因此您在插入内容中进行了一次implcit转换 - 您将DATE
转换为VARCHAR
并且无缘无故地回到DATE
;你可以这样做:
mydate AS date_value,
可能还有其他人......还值得指出D
和DAY
格式取决于您的NLS设置。