【问题标题】:To get all the dates in a format dd/mm/yyyy. I have a date field in the format yyyymmdd以 dd/mm/yyyy 格式获取所有日期。我有一个格式为 yyyymmdd 的日期字段
【发布时间】:2017-12-20 02:38:29
【问题描述】:

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

例如:

Date
20170130
20170228
20170325

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

date                  day

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

【问题讨论】:

  • 在询问有关日期和时间的问题时,需要对某些术语非常精确,例如“日期”。在 Oracle 中,“日期”数据类型不以任何“格式”存储(实际上它们存储为整数集)。那么,您的列是看起来像日期的 CHAR 或 VARCHAR2 列吗?还是它真的是 Oracle 日期数据类型?这很重要。

标签: sql oracle plsql


【解决方案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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 除非有无效的日期字符串
    • 当然,那么您可以使用正则表达式或类似的东西过滤有效的日期字符串。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        试试下面:

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

        【讨论】:

        • to_char(yrdate, 'D')? that 函数的返回值是多少?它与OP的问题有什么关系?
        • 你为什么不在你的控制台试试这个:select to_char(sysdate, 'dd-mm-yyyy'), to_char(sysdate, 'D'), to_char(sysdate, 'DAY')来自双重
        • 在我的控制台中它返回数字 3。它在你的控制台中返回什么?如果返回相同,那与 OP 的问题有什么关系?不要在测试中添加'DAY',因为那不是您在答案中写的。
        • 这是星期几。通过将“D”更改为“DAY”再试一次并查看结果
        • 我们说的是同一种语言吗?为什么我需要尝试?我没有发布错误的答案,你做到了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-09
        • 2015-09-23
        • 1970-01-01
        • 2016-01-02
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        相关资源
        最近更新 更多