在 oracle 中为 NULL 和 0 处理日期格式
Handling date formatting in oracle for NULL and 0's
我正在尝试将记录解析为 table。中的日期
记录类型为 0cyymmdd c -> century(0:19,1:20)
例如:如果日期是 00900201,则应将其转换为 1990-02-01(yyy-mm-dd)
为此,我首先将记录中的数据加载到
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
在table DT(DATE)中,DT_1(VARCHAR)
但是记录不需要总是有日期,它也可能有
空格或 0 在这种情况下此查询失败。
谁能指出我正确的方向?
对您的代码进行少量修改。如果 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
您不必更新所有行。要处理日期值可能为 zeroes 或 spaces 的情况,您可以使用 TRANSLATE[=32] 添加过滤条件=]函数。
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 的其他行。
我正在尝试将记录解析为 table。中的日期 记录类型为 0cyymmdd c -> century(0:19,1:20)
例如:如果日期是 00900201,则应将其转换为 1990-02-01(yyy-mm-dd)
为此,我首先将记录中的数据加载到 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
在table DT(DATE)中,DT_1(VARCHAR) 但是记录不需要总是有日期,它也可能有 空格或 0 在这种情况下此查询失败。
谁能指出我正确的方向?
对您的代码进行少量修改。如果 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
您不必更新所有行。要处理日期值可能为 zeroes 或 spaces 的情况,您可以使用 TRANSLATE[=32] 添加过滤条件=]函数。
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 的其他行。