Sql 带有转换函数的日期在oracle中出现错误
当我执行下面的查询时Sql 带有转换函数的日期在oracle中出现错误,sql,oracle,Sql,Oracle,当我执行下面的查询时 SELECT (TO_NUMBER (TO_CHAR ('25-07-19', 'YYYY')) - 1) + CEIL ( CASE WHEN (MONTHS_BETWEEN ( LAST_DAY ( TO_DATE ( TO_CHAR ('18-05-2020', 'DD/MM/YYYY'), 'DD-MM-YYYY')), LAST_DAY ('25-07-19')))>0 THEN MONTHS_BETWEEN ( LAST_DAY ( TO_DA
SELECT (TO_NUMBER (TO_CHAR ('25-07-19', 'YYYY')) - 1) + CEIL
(
CASE
WHEN (MONTHS_BETWEEN ( LAST_DAY ( TO_DATE ( TO_CHAR ('18-05-2020', 'DD/MM/YYYY'), 'DD-MM-YYYY')), LAST_DAY ('25-07-19')))>0 THEN
MONTHS_BETWEEN ( LAST_DAY ( TO_DATE ( TO_CHAR ('18-05-2020', 'DD/MM/YYYY'), 'DD-MM-YYYY')), LAST_DAY ('25-07-19'))
ELSE 1 END / 12) Year
FROM dual;
我得到的返回错误如下
ORA-01722: invalid number
01722. 00000 - "invalid number"
*Cause: The specified number was invalid.
*Action: Specify a valid number.
必须首先使用以下方法将带有日期的字符串值转换为日期数据类型: 您可以尝试以下方法:
SELECT (TO_NUMBER(TO_CHAR(TO_DATE('25-07-19', 'DD-MM-YY'), 'YYYY')) - 1) +
CEIL (
CASE
WHEN (MONTHS_BETWEEN(LAST_DAY(TO_DATE('18-05-2020', 'DD-MM-YYYY')), LAST_DAY(TO_DATE('25-07-19','DD-MM-YY')))) > 0 THEN
MONTHS_BETWEEN(LAST_DAY(TO_DATE('18-05-2020', 'DD-MM-YYYY')), LAST_DAY(TO_DATE('25-07-19','DD-MM-YY')))
ELSE 1
END / 12) YEAR
FROM dual;
您的错误来自调用
到\u CHAR
,例如:
TO_CHAR('25-07-19','YYYY')
或
TO_CHAR('18-05-2020','DD/MM/YYYY'))
TO_CHAR
函数重载,第一个参数可以是数字或日期;您既没有提供也没有传递字符串,因此Oracle试图将'25-07-19'
和'18-05-2020'
隐式转换为数字,因为它不知道您希望它是一个日期。您不应该依赖隐式转换
相反,您可以显式地将字符串转换为日期:
至字符(至日期('18-05-2020','DD-MM-YYYY'),'DD/MM/YYYY'))
但是,最好使用日期文字date'2020-05-18'
,或者,如果要立即将其再次转换为字符串,则只需提供正确格式的字符串
因此,您可以通过消除TO_CHAR
调用并将大部分TO_DATE
调用替换为日期文本来简化函数。类似地,您不需要使用to_NUMBER(to_CHAR(date_value,'YYYY'))
,而是可以使用EXTRACT
。您还可以将您的案例
语句替换为最大
这使您可以进行更简单的查询:
选择摘录(从日期“2019-07-25”算起的年份)
- 1
+细胞(
伟大的(
相隔数月(
最后一天(日期“2020-05-18”),
最后一天(日期“2019-07-25”)
),
1.
) / 12
)同年
来自双重;
哪些产出:
|年|
| ---: |
| 2019 |
Dfiddle为什么
到\u NUMBER(到\u CHAR('25-07-19','YYYY'))-1
而不是简单地写2018
?你想做什么?请解释查询的目的。由于不需要保留两位数的年份,因此从月到月之间删除为字符,您只是重新创建了Y2K错误,并教会OP执行同样的操作。
SELECT (TO_NUMBER(TO_CHAR(TO_DATE('25-07-19', 'DD-MM-YY'), 'YYYY')) - 1) +
CEIL (
CASE
WHEN (MONTHS_BETWEEN(LAST_DAY(TO_DATE('18-05-2020', 'DD-MM-YYYY')), LAST_DAY(TO_DATE('25-07-19','DD-MM-YY')))) > 0 THEN
MONTHS_BETWEEN(LAST_DAY(TO_DATE('18-05-2020', 'DD-MM-YYYY')), LAST_DAY(TO_DATE('25-07-19','DD-MM-YY')))
ELSE 1
END / 12) YEAR
FROM dual;
| YEAR |
| ---: |
| 2019 |