将一年中的某一天转换为某些日期格式具有 DDYYYY 并且某些日期格式具有 DDDYYYY 在 oracle 中的日期
Posted
技术标签:
【中文标题】将一年中的某一天转换为某些日期格式具有 DDYYYY 并且某些日期格式具有 DDDYYYY 在 oracle 中的日期【英文标题】:Converting Day of the Year to a date when some date formats have DDYYYY and some have DDDYYYY in oracle 【发布时间】:2018-03-08 18:55:22 【问题描述】:所以我正在尝试将一年中的某些日期转换为日期格式。问题是一年中的某一天日期在 100 天以下的日期为 DDYYYY 格式,100 天及以上的日期为 DDDYYYY 格式。我尝试了以下方法,但仍然收到“一年中的某一天必须在 1 到 365 之间(闰年为 366)”错误:
select CASE when data_Date >= 999999
then to_date(data_date, 'DDDYYYY')
when data_Date >= 99999
then to_date(data_Date, 'DDYYYY')
else to_date(data_date, 'DYYYY')
END as DATA_DATE_CONVERTED
from table;
提前致谢
样本数据如下:
Data_date (being passed in as a varchar2)
1072015
12017
612014
672013
72017
1112018
【问题讨论】:
一些示例数据会有所帮助。 抱歉,已添加! 你明白你的尝试失败的原因吧?不同的模型('DDYYYY' 和 'DYYYY')与 'DDDYYYY' 有非常不同的含义 - 它们不仅仅意味着“日”组件只有两位数或一位。相比之下,如果您的输入格式为 4-2017、53-2017 等,并且您提供的格式模型为“DDD-YYYY”,那么这将毫无问题。 【参考方案1】:这个怎么样:
with demo (data_date) as
( select 1072015 from dual union all
select 12017 from dual union all
select 612014 from dual union all
select 672013 from dual union all
select 72017 from dual union all
select 1112018 from dual )
select data_date
, to_char(data_date,'0000000')
, to_date(to_char(data_date,'0000000'),'DDDYYYY') as data_date_converted
from demo
【讨论】:
不错的答案。如果我们没有明确地在输入号码上调用TO_CHAR
,那么甲骨文老大哥无论如何都会为我们做这件事。那么为什么不显式地调用它,给它一个适合我们需要的格式模型,然后不必再接触结果字符串呢? +1【参考方案2】:
最后 4 位数字是年份。使用LPAD
将前导零放在DAY
select to_date( lpad(dayyear, 7, '0'),'DDDYYYY')
from table;
sqlfiddle
【讨论】:
【参考方案3】:您也可以在中间加上破折号 (-)。
with demo (data_date) as
( select 1072015 from dual union all
select 12017 from dual union all
select 612014 from dual union all
select 672013 from dual union all
select 72017 from dual union all
select 1112018 from dual )
select data_date, TO_DATE(SUBSTR(data_date, 1, length(data_date)-4)||'-'||SUBSTR(data_date, -4, 4), 'DDD-YYYY')
from demo;
【讨论】:
以上是关于将一年中的某一天转换为某些日期格式具有 DDYYYY 并且某些日期格式具有 DDDYYYY 在 oracle 中的日期的主要内容,如果未能解决你的问题,请参考以下文章