以dd / mm / yyyy格式获取所有日期。我有一个格式为yyyymmdd的日期字段

时间:2017-12-20 02:38:29

标签: sql oracle plsql

在我的数据库中,有一个yyyymmdd格式的日期字段。 我必须以dd-mm-yyyy的格式获取该特定日期的所有日期。

前:

Date
20170130
20170228
20170325

对于上述日期,我需要以下格式的输出以及特定日期的日期和日期

date                  day

30-01-2017            tuesday
28-02-2017            tuesday
25-03-2017            saturday

5 个答案:

答案 0 :(得分:1)

如果列是一个字符串,那么它可以保存无效的日期值,例如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
\\

Demo

答案 1 :(得分:0)

听起来您的日期实际上不是DATE字段,而是某种CHAR字段?最好的选择是转换为DATE,然后转换回CHAR

SELECT TO_CHAR(TO_DATE(mydate, 'YYYYMMDD'), 'DD-MM-YYYY Day')
  FROM mytable;

这使用YYYYMMDD掩码将您的字符串转换为日期,然后使用掩码DD-MM-YYYY Day将其转换回字符串。如果您希望日期名称为小写(如在OP中),请使用day

答案 2 :(得分:0)

@ 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.

答案 3 :(得分:0)

您似乎以字符格式保存日期列(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');

D e m o

答案 4 :(得分:-1)

尝试以下:

从yrtable选择to_char(yrdate,' dd-mm-yyyy'),to_char(yrdate,' D')