如何定义以下日期格式的日期格式掩码?

时间:2018-08-31 07:52:19

标签: sql oracle date

我有一列带有以下日期的列(示例):

1.5.2018
24.2.2018
6.11.2018
13.10.2018

如果几天或几个月中缺少“ 0”,“ DD.MM.YYYY”格式可以处理吗?如果没有,如何定义合适的日期格式掩码?

2 个答案:

答案 0 :(得分:3)

来自Oracle有关格式模型的文档:

  

FX

     

格式准确。此修饰符为TO_DATE函数的字符参数和日期时间格式模型指定完全匹配:

     
      
  • character参数中的标点和加引号的文本必须与格式模型的相应部分完全匹配(大小写除外)。
  •   
  • 字符参数不能有多余的空格。没有FX,Oracle将忽略多余的空格。
  •   
  • character参数中的数字数据必须与格式模型中的相应元素具有相同的位数。如果没有FX,字符参数中的数字可以省略前导零。
  •   
  • 启用FX时,也可以使用FM修饰符来禁用对前导零的检查。
  •   

没有FX格式模型

SELECT TO_DATE( '1.5.2018', 'DD.MM.YYYY' ) AS value FROM DUAL;

将正常工作并输出(使用我的NLS_DATE_FORMAT设置):

VALUE
--------------------
2018-05-01T00:00:00Z

,带有多余空格的组合也将如此:

SELECT TO_DATE( '1 . 5 . 2018', 'DD.MM.YYYY' ) FROM DUAL;

使用FX格式模型

SELECT TO_DATE( '1.5.2018', 'FXDD.MM.YYYY' ) AS value FROM DUAL;

礼物:

ORA-01862: the numeric value does not match the length of the format item

指定前导零将起作用:

SELECT TO_DATE( '01.05.2018', 'FXDD.MM.YYYY' ) FROM DUAL;

VALUE
--------------------
2018-05-01T00:00:00Z

但是添加多余的空格不会:

SELECT TO_DATE( '01 . 05. 2018', 'FXDD.MM.YYYY' ) FROM DUAL;

ORA-01861: literal does not match format string

要取消检查前导零,您还可以使用FM格式模型

SELECT TO_DATE( '1.5.2018', 'FMFXDD.MM.YYYY' ) FROM DUAL;

哪个输出:

VALUE
--------------------
2018-05-01T00:00:00Z

但是该语句不能使用多余的空格

SELECT TO_DATE( '1.5 .2018', 'FMFXDD.MM.YYYY' ) FROM DUAL;

ORA-01861: literal does not match format string

答案 1 :(得分:1)

'DD.MM.YYYY'格式将起作用。例如:

SQL> with yourData(stringDateCol) as (
  2      select '1.5.2018' from dual union all
  3      select '01.05.2018' from dual union all
  4      select '24.2.2018' from dual union all
  5      select '6.11.2018' from dual union all
  6      select '13.10.2018' from dual
  7  )
  8  select to_date( stringDateCol, 'dd.mm.yyyy')
  9  from yourData;

TO_DATE(ST
----------
2018-05-01
2018-05-01
2018-02-24
2018-11-06
2018-10-13

SQL>