Sql 如何插入'/';在Oracle表的varchar列中的第2个和第4个字符之后
我是Oracle的新手,在Oracle 10g中工作。我有一个表Sql 如何插入'/';在Oracle表的varchar列中的第2个和第4个字符之后,sql,oracle,oracle11g,oracle10g,Sql,Oracle,Oracle11g,Oracle10g,我是Oracle的新手,在Oracle 10g中工作。我有一个表WW\u WAGEMAST,它有一个类型为varchar2(11)的列,用于保存PF\u Join\u date。它的日期格式为ddmmyyyy和dd/mm/yyyy。我想将所有日期转换为单一格式dd/mm/yyy。我该怎么做 例如——当前情况: PF_JOIN_DATE ------------ 01/04/2018 02042018 03042018 04/04/2018 05042018 我需要将所有内容更改为以下格
WW\u WAGEMAST
,它有一个类型为varchar2(11)
的列,用于保存PF\u Join\u 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
我该怎么做?请帮帮我。提前感谢。您可以写:
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 '%/%'
你可以写:
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 '%/%'
这将有助于:
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
这将有助于:
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
使用regexp
update plv_test_table t
set t.pf_join_date = regexp_replace(t.pf_join_date, '^(\d{2})(\d{2})(\d{4})$','\1/\2/\3')
(可选)-根据表的大小,更新全部或部分行可能会更快。如果没有where子句,此查询仍然正确
where t.pf_join_date not like '%/%'
使用regexp
update plv_test_table t
set t.pf_join_date = regexp_replace(t.pf_join_date, '^(\d{2})(\d{2})(\d{4})$','\1/\2/\3')
(可选)-根据表的大小,更新全部或部分行可能会更快。如果没有where子句,此查询仍然正确
where t.pf_join_date not like '%/%'
使用varchar for date的糟糕设计使用date数据类型,而不是“我想将所有日期转换为单一格式dd/mm/yyyy”-为什么?。由于您计划更改记录,我建议您完全修改表定义,并将
PF\u JOIN\u DATE
的数据类型更改为DATE。只需使用类似于返回日期的函数将其放入另一列,删除PF_Join_date
并将此列重命名为PF_Join_date
永远不要在varchar
列中存储日期值。您当前的问题是该错误设计决策的直接结果。使用varchar for date的错误设计使用date数据类型,而不是“我想将所有日期转换为单一格式dd/mm/yyyy”-为什么?。由于您计划更改记录,我建议您完全修改表定义,并将PF\u JOIN\u DATE
的数据类型更改为DATE。只需使用类似于返回日期的函数将其放入另一列,删除PF_Join_date
并将此列重命名为PF_Join_date
永远不要在varchar
列中存储日期值。您当前的问题是该错误设计决策的直接结果。非常感谢您的支持和努力。它工作得很好。@FARHAN你现在可以给它打个绿色的勾了。非常感谢你的支持和努力。它工作得很好。@FARHAN你现在可以给它打个绿色记号了