处理oracle中的日期格式为NULL和0' s

时间:2015-08-20 05:42:25

标签: sql oracle date-formatting

我正在尝试将记录解析为表格。中的日期  记录的类型为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表示此查询失败。

有人能指出我正确的方向吗?

2 个答案:

答案 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。