如何在oracle中截断yyyy / mm / dd hh:mm:ss.SSS到mm / dd / yyyy

时间:2017-12-13 07:38:36

标签: oracle date datetime

当我运行查询以获取日期时,会以'yyyy/mm/dd hh:mm:ss.SSS'的格式检索它,但我需要将其转换为mm/dd/yyyy

我正在使用此查询进行转换

select 
    to_char(
        add_months (
            to_date(
                to_char(
                    trunc(
                        TO_DATE('2016/01/01 00:00:00.0', 'YYYY/MM/DD HH24:MI:SS.SSS')
                    ), 'MM/DD/YYYY' -- to char
            ),'MM/DD/YYYY' -- to date
        ), -2*1  -- add months
    ), 'MM/DD/YYYY' -- to char
) START_DATE,

to_char(
    add_months (
        to_date(
            to_char(
                trunc(
                    TO_DATE('2017/01/01 00:00:00.0', 'YYYY/MM/DD HH24:MI:SS.SSS')
                ), 'MM/DD/YYYY' -- to char
            ), 'MM/DD/YYYY'  -- to date
         ), 3 -- add months
    ), 'MM/DD/YYYY' -- to char
) END_DATE

from dual;

输出

ORA-01810: format code appears twice
01810. 00000 -  "format code appears twice"

2 个答案:

答案 0 :(得分:2)

问题在于to_date本身的转换。以下转换本身就是抛出你提到的错误

select 
TO_DATE('2017/01/01 00:00:00.0', 'YYYY/MM/DD HH24:MI:SS.SSS') END_DATE
from dual;

如果要将带有时间戳的字符串转换为时间戳

,则需要像下面一样使用它
select TO_TIMESTAMP('2017/01/01 00:00:00.0', 'YYYY/MM/DD HH24:MI:SS.FF') from dual

这只会满足您的需求,而不是进行如此多的转换。

select to_char(
   add_months(
     TO_TIMESTAMP('2017/01/01 00:00:00.0', 'YYYY/MM/DDHH24:MI:SS.FF'),
   -2),
'mm/dd/yyyy') from dual

答案 1 :(得分:1)

  

ORA-01810:格式代码出现两次

那是因为SS.SSSSSS不是有效的日期格式。您正尝试处理小数秒,但是:

  1. 正确的格式掩码为FF
  2. DATE不支持小数秒,仅支持TIMESTAMP
  3. 真正的日期格式是显示问题,应由客户端的NLS设置处理。但如果你真的必须在SQL中这样做,这就是你所需要的:

    select 
        to_char(DATE '2015-11-01', 'MM/DD/YYYY') START_DATE
        , to_char(DATE '2017-04-01', 'MM/DD/YYYY') END_DATE
    from dual;
    

    您不需要trunc(),因为日期文字已经设置为午夜。您不需要add_months(),因为您只需更改日期文字的值即可。您不需要将日期转换为字符串回到日期,因为您根本就没有。