当我运行查询以获取日期时,会以'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"
答案 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.SSS
。 SSS
不是有效的日期格式。您正尝试处理小数秒,但是:
FF
真正的日期格式是显示问题,应由客户端的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()
,因为您只需更改日期文字的值即可。您不需要将日期转换为字符串回到日期,因为您根本就没有。