我的问题的背景是:
查询的特定部分:
ROUND(MONTHS_BETWEEN(sysdate, TO_DATE(c.registration_date, 'dd.mm.yy')) / 12, 1) AS Years_Client
问题:
切勿在已经是
TO_DATE
的列上使用 DATE
。
TO_DATE
将字符串作为第一个参数,然后向其传递 DATE
,然后 Oracle 需要将其转换为字符串,以便 TO_DATE
可以将其转换回日期 - 可以是:
毫无意义(因为已经是约会了);或
会导致错误(如您的情况),因为 Oracle 会将您的查询转换为:
ROUND(
MONTHS_BETWEEN(
sysdate,
TO_DATE(
TO_CHAR(
c.registration_date,
(SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT')
),
'dd.mm.yy'
)
) / 12,
1
)
如果
NLS_DATE_FORMAT
与 dd.mm.yy
不匹配,那么它将引发异常,或者您将得到错误的值。
要解决此问题,请删除
TO_DATE
:
ROUND(MONTHS_BETWEEN(sysdate, c.registration_date) / 12, 1) AS Years_Client