Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 带有转换函数的日期在oracle中出现错误_Sql_Oracle - Fatal编程技术网

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 |