0

当我在 oracle 10g 中执行此操作时:

select to_date(trunc(SOMEINPUTdATE)) from table1
where to_date(trunc(date_column_timestamp),'MM/DD/YYYY')
  >= to_date('03/11/2011' ,'MM/DD/YYYY')

我得到:ORA-01843: not a valid month如果我更改为 : 'YYYY/MM/DD',它会起作用。但是'MM/DD/YYYY'一个有效的格式对吗?

4

1 回答 1

7

你把事情搞混了。TO_DATE 将字符串转换为 DATE。如果date_column_timestamp已经是日期,则无需将其转换为日期。

select trunc(SOMEINPUTdATE) from table1
where trunc(date_column_timestamp)
  >= to_date('03/11/2011' ,'MM/DD/YYYY')

ORA-01843是由日期到字符串的隐式转换引起的。换句话说,如下:

to_date(trunc(date_column_timestamp),'MM/DD/YYYY')

相当于(假设默认日期格式DD-MON-YYYY):

to_date(TO_CHAR(trunc(date_column_timestamp),'DD-MON-YYYY'),'MM/DD/YYYY')

因此,TO_CHAR返回类似于'11-MAR-2011'的内容,然后to_date由于日期格式不匹配而导致失败。

select您的条款中也存在同样的问题。你不需要to_date一个trunc日期列。

于 2011-03-09T04:54:09.783 回答