如何在 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
。它具有ddmmyyyy
和dd/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表中的字段由integer 转变为varchar2(50)
想要从 ORACLE SQL 中的 2 个单独的列中为一个团队提供平均点