我正在尝试将记录解析为表格。中的日期 记录的类型为0cyymmdd c - >世纪(0:19,1:20)
例如:如果日期是000000201,则应转换为1990-02-01(yyy-mm-dd)
为此,我最初将记录中的数据加载到a varchar列,然后使用以下查询对其进行格式化:
UPDATE TABLE
DATE= CASE SUBSTR((DT_1),2,1)
WHEN '0' THEN TO_DATE('19' || SUBSTR(DT_1,3),'yyyy-mm-dd')
WHEN '1' THEN TO_DATE('20' || SUBSTR(DT_1,3),'yyyy-mm-dd')
ELSE NULL
END
表DT(DATE),DT_1(VARCHAR) 但是记录不需要总是有日期,它也可能有 空格或0表示此查询失败。
有人能指出我正确的方向吗?
答案 0 :(得分:1)
对代码进行少量修改。如果dt1字段也有0或空值,这些将起作用。
UPDATE TABLE a
set a.DATE_column= CASE
WHEN SUBSTR((DT_1),2,1)='0' THEN TO_DATE('19' || SUBSTR(DT_1,3),'yyyy-mm-dd')
WHEN SUBSTR((DT_1),2,1)=1 THEN TO_DATE('20' || SUBSTR(DT_1,3),'yyyy-mm-dd')
when (dt_1 = '0') or (dt_1 = null)
then null
ELSE NULL
END
答案 1 :(得分:1)
您不必更新所有行。要处理日期值可能零或空格的情况,您可以使用 TRANSLATE 函数添加过滤条件。
WHERE translate(column_name, '#0 ','#') IS NOT NULL
例如,
<强>设置强>
SQL> CREATE TABLE t(A VARCHAR2(8), b DATE);
Table created.
SQL> INSERT INTO t(A) VALUES('00900201');
1 row created.
SQL> INSERT INTO t(A) VALUES('01150820');
1 row created.
SQL> INSERT INTO t(A) VALUES(' ');
1 row created.
SQL> INSERT INTO t(A) VALUES('00000000');
1 row created.
SQL> COMMIT;
Commit complete.
SQL> SELECT * FROM t;
A B
-------- ---------
00900201
01150820
00000000
更新声明
SQL> UPDATE t
2 SET b = CASE
3 WHEN SUBSTR(A, 2, 1) = '0'
4 THEN to_date('19'
5 ||SUBSTR(A, 3), 'YYYYMMDD')
6 WHEN SUBSTR(A, 2, 1) = '1'
7 THEN to_date('20'
8 ||SUBSTR(A, 3), 'YYYYMMDD')
9 ELSE NULL
10 END
11 WHERE translate(A, '#0 ','#') IS NOT NULL
12 /
2 rows updated.
<强>验证强>
SQL> SELECT * FROM t;
A B
-------- ---------
00900201 01-FEB-90
01150820 20-AUG-15
00000000
SQL>
因此,它更新了具有正确日期值的所需2行。将其更新的其他行更新为NULL。