【发布时间】:2018-12-20 14:47:32
【问题描述】:
我在 Excel 中收到了数据,并且 DATE 列(名为 ALL_PERIODS)是 STRING 并且具有以下格式:
JFM 14 - W/E 04/05/14
2014 年 1 月、2 月、3 月,周末 04/05/14
我需要将此列分为三个新列:DATE_ (DATE)、YEAR_ (INT)、QUARTER_ (INT),所以我写了这些转换:
列日期:
ALTER TABLE MY_TABLE
ADD DATE_TEMP VARCHAR2 (128);
UPDATE MY_TABLE
SET DATE_TEMP = SUBSTR(ALL_PERIODS, -2, 2);
UPDATE MY_TABLE
SET DATE_TEMP = REPLACE(DATE_TEMP, '/', '');
UPDATE MY_TABLE
SET DATE_TEMP = to_char(to_date(DATE_TEMP, 'mmddyyyy'), 'yyyy-mm-dd');
UPDATE MY_TABLE
SET DATE_TEMP = REPLACE(DATE_TEMP, '00', '20');
UPDATE MY_TABLE
SET DATE_TEMP = TO_DATE(DATE_TEMP, 'YYYY-MM-DD');
ALTER TABLE MY_TABLE
ADD DATE_ DATE;
UPDATE MY_TABLE
SET DATE_ = DATE_TEMP;
ALTER TABLE MY_TABLE
DROP COLUMN DATE_TEMP;
列年份:
ALTER TABLE MY_TABLE
ADD YEAR_TEMP VARCHAR2(128 BYTE);
UPDATE MY_TABLE
SET YEAR_TEMP = SUBSTR(ALL_PERIODS, 8, 4);
ALTER TABLE MY_TABLE
ADD YEAR_ NUMBER(4);
UPDATE MY_TABLE
SET YEAR_ = YEAR_TEMP;
UPDATE MY_TABLE
SET YEAR_ = CONCAT('20', YEAR_);
ALTER TABLE MY_TABLE
DROP COLUMN YEAR_TEMP;
列季度:
ALTER TABLE MY_TABLE
ADD QUARTER NUMBER(1);
UPDATE MY_TABLE
SET QUARTER_ = 4
WHERE DATE_ = '30-DEC-17';
...and the same with other 3 quarters
不知何故可行,但我想它不是有效的(我的SQL不是很高级,我还在学习),并且更新操作太慢了,所以我想改造一下ALL_PERIODS 列,同时将数据插入到具有三个所需列的新表中。
您能告诉我,INSERT 应该是什么样子吗? 谢谢 N.
【问题讨论】:
-
你如何区分六月和七月和一月?
-
数据按季度分发,始终为 JFM、AMJ、JAS 或 OND。但几个月对我的分析并不重要。我需要四分之一(整数或数字)。
-
这可以通过简单的
CASE语句来处理。
标签: sql oracle date sql-insert transformation