在我的数据库中,有一个yyyymmdd格式的日期字段。我必须以dd-mm-yyyy的格式获取该特定日期的所有日期。
例如:
Date
20170130
20170228
20170325
对于上述日期,我需要以下格式的输出与特定日期的日期和日期
date day
30-01-2017 tuesday
28-02-2017 tuesday
25-03-2017 saturday
如果列是一个字符串,那么它可以保存无效的日期值,例如February 31
,一种方法可以避免这种情况,例如:
create or replace
function my_to_date( p_str in varchar2 ) return date
is
begin
return to_date( p_str );
exception
when others then
return null;
end;
\\
select to_char(my_to_date('20170231'),'DD-MM-YYYY Day')
from dual
\\
听起来你的日期实际上不是DATE
领域,而是某种CHAR
领域?最好的选择是转换为DATE
然后转换回CHAR
:
SELECT TO_CHAR(TO_DATE(mydate, 'YYYYMMDD'), 'DD-MM-YYYY Day')
FROM mytable;
这使用YYYYMMDD
掩码将您的字符串转换为日期,然后使用掩码DD-MM-YYYY Day
将其转换回字符串。如果您想要小写的日期名称(如在您的OP中),请使用day
。
@ user2778168答案会给你想要的结果。但为什么?
除非使用字符类型定义定义日期,否则您的数据库没有以yyyymmdd格式存储的日期或任何其他日期格式。 Oracle将所有日期存储在单个内部结构中,并且只有轻微的变化时间戳是相同的。使用的格式仅告知Oracle如何显示值或将字符串转换为日期。除非指定了特定格式,否则Oracle使用NLS_DATE_FORMAT进行此确定。有关格式规范,请参阅here并向下扫描到“日期时间格式模型”。
要查看此操作,请执行以下操作
select value
from nls_session_parameters
where parameter = 'NLS_DATE_FORMAT';
Select yrdate default_format
, to_char(yrdate, 'dd-mm-yyyy') specified_format
, dump(yrdate) unformated
from yrtable;
alter session set nls_date_format = 'Month dd,yyyy';
Rerun the above queries.
看来你用字符格式保存日期列(date1
)。假设您有一个名为days
的表:
SQL> desc days
date1 varchar2(10)
然后,
我们应该将它转换为日期,然后转换为char格式,使用引号中的别名来提供您想要的小写别名。
也许你的数据库的日期语言非像我的英语(turkish
),那么你需要将它转换为english
。
最后,从输出中看出,根据转换日期对结果进行排序是合适的。所以我们可以使用以下SQL:
select to_char(to_date(date1,'yyyymmdd'),'dd-mm-yyyy') "date",
to_char(to_date(date1,'yyyymmdd'),'day','nls_date_language=english') "day"
from days
order by to_date(date1,'yyyymmdd');
试试以下:
从yrtable中选择to_char(yrdate,'dd-mm-yyyy'),to_char(yrdate,'D')