[英]Convert VARCHAR to Date with different date formatted - ORACLE
我有一个具有 2 种不同日期格式的字段,我希望它具有相同的格式,以便我可以执行 TO_DATE。
DATE|FORMAT|DATA_TYPE
2020-12-15|YYYY-MM-DD|VARCHAR
12/16/2020|MM/DD/YYYY|VARCHAR
DATE|FORMAT|DATA_TYPE
2020-12-15|YYYY-MM-DD|DATE
2020-12-16|YYYY-MM-DD|DATE
我在下面尝试过
TO_DATE(ACQUIREDDATE,'YYYY-MM-DD')
如果您只有两种格式,则可以使用case
表达式:
select (case when date like '%-%-%' then to_date(date, 'YYYY-MM-DD')
else to_date(date, 'MM/DD/YYYY')
end) as real_date
to_date()
的第二个参数可以是一个表达式,就像第一个参数一样 - 它不必是硬编码的(它不必是字符串文字)。
特别是,如果日期格式存储在单独的列中,您可以将其作为第二个参数传入。
在下图中,首先我设置了要用于 session 的日期格式。 然后我显示查询——包括一个 WITH 子句(不是解决方案的一部分)。只是为了提供测试数据。
alter session set nls_date_format='dd-MON-yyyy';
with
my_table (acquireddate, dtformat) as (
select '2020-12-15', 'YYYY-MM-DD' from dual union all
select '12/16/2020', 'MM/DD/YYYY' from dual
)
select acquireddate, dtformat,
to_date(acquireddate, dtformat) as my_date
from my_table
;
ACQUIREDDATE DTFORMAT MY_DATE
------------ ---------- -----------
2020-12-15 YYYY-MM-DD 15-DEC-2020
12/16/2020 MM/DD/YYYY 16-DEC-2020
最安全的方法是使用VALIDATE_CONVERSION
function(在 Oracle 12.2 中引入)如下:
SQL> -- sample data
SQL> with your_table (date_col) as (
2 select '2020-12-15' from dual union all
3 select '12/16/2020' from dual
4 )
5 -- Query starts from here
6 SELECT DATE_COL,
7 TO_DATE(DATE_COL, -- Your table's column name
8 CASE WHEN VALIDATE_CONVERSION(DATE_COL AS DATE,'YYYY-MM-DD') = 1
9 THEN 'YYYY-MM-DD' -- format of the column according to VALIDATE_CONVERSION
10 ELSE 'MM/DD/YYYY' -- format of the column according to VALIDATE_CONVERSION
11 END) AS DATE_DERIVED
12 FROM YOUR_TABLE;
DATE_COL DATE_DERIVED
---------- --------------------
2020-12-15 15-DEC-2020 00:00:00
12/16/2020 16-DEC-2020 00:00:00
SQL>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.