如何以“dd/mm/yyyy”格式调整日期

Posted

技术标签:

【中文标题】如何以“dd/mm/yyyy”格式调整日期【英文标题】:How to adjust dates in the format "dd/mm/yyyy" 【发布时间】:2019-07-02 04:41:52 【问题描述】:

我正在尝试将日期从“dd/mm/yyyy”调整为“dd-mm-yy”,但没有成功。 在我的数据集中我有不同的日期格式,所以我会过滤掉它们以正确更正

例子:

  DATES
  -------
  09-MAY-18
  09-NOV-18
  09-OCT-18
  1/2/2017
  1/3/2017
  05/03/2018
  12-OCT-18

因此,日期“2017 年 1 月 2 日”、“2017 年 1 月 3 日”、“05/03/2018”的格式应为“DD-MM-YYYY”,即“09-MAY-18”或“09-NOV-18”。

我尝试运行的公式是:

   UPDATE TESTE_DATAS SET DATAS = TO_DATE(REGEXP_REPLACE(DATAS, '^\d+\/\d+\/\d+$', 
                                    CONCAT(
                                      CONCAT(
                                        CONCAT(
                                          CONCAT(
                                                REGEXP_SUBSTR(DATAS, '^(\d+)(\/)(\d+)(\/)(\d+)$', 1, 1, 'i', 1),
                                                '-'),
                                                      REGEXP_SUBSTR(DATAS, '^(\d+)(\/)(\d+)(\/)(\d+)$', 1, 1, 'i', 3)),
                                                      '-'),
                                                         REGEXP_SUBSTR(DATAS, '^(\d+)(\/)(\d+)(\/)(\d+)$', 1, 1, 'i', 5)) 
                                        ),'DD-MM-YY') WHERE REGEXP_LIKE(DATAS,'^\d+\/\d+\/\d+$');

最后我得到了以下结果:

Error report -
SQL Error: ORA-01843: not a valid month
01843. 00000 -  "not a valid month"
*Cause:    
*Action:

预期的结果应该是:

  DATES
  -------
  09-MAY-18
  09-NOV-18
  09-OCT-18
  01-FEB-17
  01-MAR-17
  05-MAR-18
  12-OCT-18

【问题讨论】:

你列的数据类型是date还是varchar2? 你使用的是什么版本的数据库? 【参考方案1】:

您可以先将字符串转换为TO_DATE 的日期,然后使用TO_CHAR 格式化日期:

update teste_datas set datas = to_char(to_date(datas, 'DD/MM/YYYY'), 'DD-MON-YY') where datas like '%/%/%';

【讨论】:

嗨@blhsing,我没有成功:Error at Command Line : 204 Column : 87Error report -SQL Error: ORA-00904: "DATES": invalid identifier00904. 00000 - "%s: invalid identifier"*Cause:*Action: 日期列被命名为DATAS,而不是DATES,根据您的问题。修正拼写,它会起作用。【参考方案2】:

从示例数据来看,字符类型列dates 似乎存在三种不同类型的格式。

考虑下面的代码块。如果转换为'dd-MON-yy' 时出现格式异常,则由于长度不同,对其他模型的更新格式会有所不同

create table teste_datas( id int, dates varchar2(20),derived_date date);
insert all 
       into teste_datas(id,dates) values(1,'09-MAY-18')
       into teste_datas(id,dates) values(2,'1/2/2017')
       into teste_datas(id,dates) values(3,'05/03/2018')
select * from dual;

begin
    for d in ( select id, trim(dates) as dates from teste_datas order by id )
    loop
     begin  
      update teste_datas 
         set derived_date = to_date(d.dates,'dd-MON-yy')
       where id = d.id;
      exception when others then
       begin 
        if length(d.dates)<10 then 
          update teste_datas 
             set derived_date = to_date(d.dates,'mm/dd/yyyy')
           where id = d.id;       
        else   
          update teste_datas 
             set derived_date = to_date(d.dates,'dd/mm/yyyy')
           where id = d.id;       
        end if;   
       end;  
     end;    
    end loop;  
  end;  

  select * from teste_datas;

  ID    DATES       DERIVED_DATE
  ---   ----------  ------------
  1     09-MAY-18   09.05.2018
  2     1/2/2017    02.01.2017
  3     05/03/2018  05.03.2018

  select to_char(derived_date,'dd-MON-yy') as derived_date from teste_datas;

  DERIVED_DATE
  ------------
  09-MAY-18
  02-JAN-17
  05-MAR-18

【讨论】:

以上是关于如何以“dd/mm/yyyy”格式调整日期的主要内容,如果未能解决你的问题,请参考以下文章

如何屏蔽 EditText 以显示 dd/mm/yyyy 日期格式

如何以 HTML5 输入类型日期格式(dd/mm/yyyy)显示猫鼬日期,

通过laravel Eloquent Model以dd / mm / yyyy插入日期格式

如何强制输入日期格式为 dd/mm/yyyy? [复制]

如何以 dd/mm/yyyy hh:mm 格式从 CSV 导入日期到 R 中的通用数字字符串

如何将chrome,YYYY-MM-DD上的打印预览标题的日期格式更改为DD / MM / YYYY