在 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

您不必更新所有行。要处理日期值可能为 zeroesspaces 的情况,您可以使用 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 的其他行。