如何在 Oracle 表的 varchar 列中的第二个和第四个字符之后插入“/”

Posted

技术标签:

【中文标题】如何在 Oracle 表的 varchar 列中的第二个和第四个字符之后插入“/”【英文标题】:How to Insert '/' after 2nd and 4th char in varchar column of an Oracle table 【发布时间】:2018-12-03 05:34:10 【问题描述】:

我是 Oracle 新手,在 Oracle 10g 中工作。我有一个表WW_WAGEMAST,它有一个varchar2(11) 类型的列用于保存PF_Join_date。它具有ddmmyyyydd/mm/yyyy 两种格式的日期。我想以单一格式 dd/mm/yyy 转换所有日期。我该怎么做?

例如——目前的情况:

PF_JOIN_DATE
------------
01/04/2018 
02042018 
03042018 
04/04/2018 
05042018

我需要将所有内容更改为这样的单一格式:

PF_JOIN_DATE
---------------
01/04/2018 
02/04/2018 
03/04/2018 
04/04/2018 
05/04/2018

我该怎么做?请帮我。提前致谢。

【问题讨论】:

其糟糕的设计使用 varchar 作为日期,而是使用日期数据类型 “我想将所有日期转换为单一格式 dd/mm/yyyy” - 为什么?由于您打算更改记录,我建议这是一个彻底修改表定义并更改PF_JOIN_DATE 的数据类型的好机会。只需使用类似this 的函数返回日期,将其放入另一列,删除PF_Join_date 并将此列重命名为PF_Join_date 永远不要将 DATE 值存储在 varchar 列中。您当前的问题是错误设计决策的直接结果。 【参考方案1】:

你可以写:

update WW_WAGEMAST
set PF_JOIN_DATE = substr(PF_JOIN_DATE, 1, 2) || '/' ||
                   substr(PF_JOIN_DATE, 3, 2) || '/' ||
                   substr(PF_JOIN_DATE, 5, 4)
where PF_JOIN_DATE not like '%/%'

【讨论】:

【参考方案2】:

这将起作用:

CREATE TABLE d061_Table1
    ("PF_JOIN_DATE" varchar2(10))
;

INSERT ALL 
    INTO d061_Table1 ("PF_JOIN_DATE")
         VALUES ('01/04/2018')
    INTO d061_Table1 ("PF_JOIN_DATE")
         VALUES ('02042018')
    INTO d061_Table1 ("PF_JOIN_DATE")
         VALUES ('03042018')
    INTO d061_Table1 ("PF_JOIN_DATE")
         VALUES ('04/04/2018')
    INTO d061_Table1 ("PF_JOIN_DATE")
         VALUES ('05042018')
SELECT * FROM dual
;

select * from d061_Table1;
update d061_Table1 set PF_JOIN_DATE=
(substr(PF_JOIN_DATE, 1, 2) || '/' ||
          substr(PF_JOIN_DATE, 3, 2) || '/' ||
          substr(PF_JOIN_DATE, 5, 4))
where not regexp_like(PF_JOIN_DATE, '^[0-9]2,/1[0-9]2,/1[0-9]4,$');

select * from d061_Table1;

output:
01/04/2018
02/04/2018
03/04/2018
04/04/2018
05/04/2018

【讨论】:

非常感谢您的支持和努力。它工作得很好。 @FARHAN 你现在可以给它一个绿色的勾【参考方案3】:

使用正则表达式。

update plv_test_table t
set t.pf_join_date = regexp_replace(t.pf_join_date, '^(\d2)(\d2)(\d4)$','\1/\2/\3')

可选 - 根据表的大小,更新全部或部分行会更快。如果没有 where 子句,此查询仍然正确。

where t.pf_join_date not like '%/%'

【讨论】:

以上是关于如何在 Oracle 表的 varchar 列中的第二个和第四个字符之后插入“/”的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql中的动态数据透视

如何将oracle表中的字段由integer 转变为varchar2(50)

oracle sql中的动态数据透视

想要从 ORACLE SQL 中的 2 个单独的列中为一个团队提供平均点

无效的 XML 字符错误 - 如何从 VARCHAR2 数据库列中查找无效字符?

Oracle在所有表的所有列中搜索字符串[重复]