格式化存储为字符串的日期

时间:2016-01-29 16:27:42

标签: sql oracle date

我正在使用一个包含日期值的字符串列(我没有设计它,但我必须使用它)。大约有2500条记录。

大多数日期值以MM / DD / YYYY格式输入(前面的'0'),但是有一些流氓记录是MM / DD / YY格式,或者其他一些没有前面的'0'

源数据示例:

05/01/2010
05/29/2011
05/20/2012
05/06/2015

我需要按顺序返回一个不同的值列表,所有值都以相同的方式(MM / DD / YYYY)格式化。

{{1}}

鉴于这些价值观输入方式缺乏一致性,我不确定如何实现目标?

2 个答案:

答案 0 :(得分:2)

嗯,没有给出在这种特殊情况下使用DB的内容。让我们假设这是Oracle DB,所有日期都以Month开头,所需的结果是字符串,而5/1/10不是1910年5月1日。您可以这样做:

select to_char(to_date('5/1/10', 'MM/DD/YY'), 'MM/DD/YYYY') from dual;
select to_char(to_date('05/20/2012', 'MM/DD/YY'),'MM/DD/YYYY') from dual;
select to_char(to_date('5/29/2011', 'MM/DD/YY'), 'MM/DD/YYYY') from dual;
select to_char(to_date('5/6/2015', 'MM/DD/YY'),'MM/DD/YYYY') from dual;

你会得到

05/01/2010
05/20/2012
05/29/2011    
05/06/2015

答案 1 :(得分:2)

如果列中的日期只有两种可能的格式:
x / xx / xx - > MM / DD / YY
xx / xx / xxxx - >毫米/日/年

然后使用简单的to_date( column_name, 'mm/dd/yy' )将字符串转换为日期,然后使用to_char( value, 'mm/dd/yyyy' )将日期转换回所需的格式。

简单:

to_char( to_date( column_name, 'mm/dd/yy' ), 'mm/dd/yyyy' ) 

您在to_date函数中只能使用一种转换格式mm/dd/yy,因为Oracle使用的转换规则和此处描述的(在“String-to-Date Conversion Rules”主题下):
http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34924

简而言之 - 如果格式模型mm/dd/yy10/12/2014之类的字符串不匹配,那么Oracle会自动尝试其他格式模型:mm/dd/yyyy