Oracle Date in Where Clause 给我这个错误 ORA-00932: inconsistent datatypes: expected NUMBER got DATE
Oracle Date in Where Clause give me this error ORA-00932: inconsistent datatypes: expected NUMBER got DATE
sql 请求是:
select DRCR_CR_DT
from PS_DRCR
where
TRUNC(DRCR_CR_DT)= TO_DATE('1/4/2022','dd/mon/yyyy');
DRCR_CR_DT 的类型是:DATE
DRCR_CR_DT 包含这样的内容:1/4/2022 2:02:54 PM
谢谢您的回答
我期待一些不同的东西;如果您提供的日期是 1/4/2022
,则其中没有 mon
格式模型:
SQL> select to_date('1/4/2022', 'dd/mon/yyyy') from dual;
select to_date('1/4/2022', 'dd/mon/yyyy') from dual
*
ERROR at line 1:
ORA-01843: not a valid month
修复后:
SQL> select to_date('1/4/2022', 'dd/mm/yyyy') from dual;
TO_DATE('1
----------
01/04/2022
SQL>
如果不是,请提供示例数据(CREATE TABLE
和 INSERT INTO
语句)。
[编辑]
这是您应该提供的;根据您的评论,现在我必须这样做:
DRCR_CR_DT is a varchar2 the containt of DRCR_CR_DT is 01/04/2022 00:00:00
因此:
SQL> create table ps_drcr (drcr_cr_dt varchar2(20));
Table created.
SQL> insert into ps_drcr values ('01/04/2022 00:00:00');
1 row created.
查询:TO_DATE
的格式模型必须匹配数据格式。如果 table 包含 00:00:00,则格式模型是 hh24:mi:ss
,而不是您使用的 hh:mi:ss am
。
在这种情况下,查询可以针对这个特定值。
SQL> select *
2 from ps_drcr
3 where TRUNC(TO_DATE(DRCR_CR_DT, 'DD/MM/YYYY HH24:MI:SS')) =
4 TO_DATE('1/4/2022','dd/mm/yyyy');
DRCR_CR_DT
--------------------
01/04/2022 00:00:00
SQL>
请注意,将 date
数据类型值存储为字符串(到 varchar2
列)总是一个非常糟糕的主意,因为没有什么能阻止您存储例如ab/&4/20xz 0a:f8:fi
到 varchar2
列,这肯定不是有效的日期值。如果 table 中至少有一行 drcr_cr_dt
不代表有效日期,查询将 失败 .
错误意味着 DRCR_CR_DT
是一个字符串,而不是一个真正的日期 - 所以它的数据类型是 VARCHAR2 而不是你说的 DATE。
create table PS_DRCR (DRCR_CR_DT) AS
select '1/4/2022 2:02:54 PM' from dual;
select DRCR_CR_DT
from PS_DRCR
where
TRUNC(DRCR_CR_DT)= TO_DATE('1/4/2022','dd/mon/yyyy');
ORA-00932: inconsistent datatypes: expected NUMBER got DATE
如果它真的是一个日期,它就可以工作——至少,格式模型是固定的,正如@Littlefoot 指出的那样。
如果您坚持将其作为字符串使用(这是一个糟糕的数据模型),那么您需要在截断之前将其转换为日期:
select DRCR_CR_DT
from PS_DRCR
where
TRUNC(TO_DATE(DRCR_CR_DT, 'DD/MM/YYYY HH:MI:SS AM')) = TO_DATE('1/4/2022','dd/mm/yyyy');
DRCR_CR_DT
-------------------
1/4/2022 2:02:54 PM
您还可以与日期文字进行比较:
select DRCR_CR_DT
from PS_DRCR
where
TRUNC(TO_DATE(DRCR_CR_DT, 'DD/MM/YYYY HH:MI:SS AM')) = DATE '2022-04-01';
你得到 ORA-00932 的原因是,在它查看涉及的实际值之前,解析器会看到如下内容:
where TRUNC(<some string>) = TO_DATE(<some string>)
The numeric form of TRUNC "takes as an argument any numeric data type or any nonnumeric data type that can be implicitly converted to a numeric data type", while the date form 仅采用“日期时间数据类型”。这意味着 TRUNC(<some string>)
必须被解释为一个数字。
因此无需查看要转换的任何一个字符串,它就知道转换为:
where <some number> = <some date>
它会在进行任何实际转换之前进行分析,因此不会尝试转换日期字符串;当它确实达到将抛出 ORA-01843 的程度时。
sql 请求是:
select DRCR_CR_DT
from PS_DRCR
where
TRUNC(DRCR_CR_DT)= TO_DATE('1/4/2022','dd/mon/yyyy');
DRCR_CR_DT 的类型是:DATE
DRCR_CR_DT 包含这样的内容:1/4/2022 2:02:54 PM
谢谢您的回答
我期待一些不同的东西;如果您提供的日期是 1/4/2022
,则其中没有 mon
格式模型:
SQL> select to_date('1/4/2022', 'dd/mon/yyyy') from dual;
select to_date('1/4/2022', 'dd/mon/yyyy') from dual
*
ERROR at line 1:
ORA-01843: not a valid month
修复后:
SQL> select to_date('1/4/2022', 'dd/mm/yyyy') from dual;
TO_DATE('1
----------
01/04/2022
SQL>
如果不是,请提供示例数据(CREATE TABLE
和 INSERT INTO
语句)。
[编辑]
这是您应该提供的;根据您的评论,现在我必须这样做:
DRCR_CR_DT is a varchar2 the containt of DRCR_CR_DT is 01/04/2022 00:00:00
因此:
SQL> create table ps_drcr (drcr_cr_dt varchar2(20));
Table created.
SQL> insert into ps_drcr values ('01/04/2022 00:00:00');
1 row created.
查询:TO_DATE
的格式模型必须匹配数据格式。如果 table 包含 00:00:00,则格式模型是 hh24:mi:ss
,而不是您使用的 hh:mi:ss am
。
在这种情况下,查询可以针对这个特定值。
SQL> select *
2 from ps_drcr
3 where TRUNC(TO_DATE(DRCR_CR_DT, 'DD/MM/YYYY HH24:MI:SS')) =
4 TO_DATE('1/4/2022','dd/mm/yyyy');
DRCR_CR_DT
--------------------
01/04/2022 00:00:00
SQL>
请注意,将 date
数据类型值存储为字符串(到 varchar2
列)总是一个非常糟糕的主意,因为没有什么能阻止您存储例如ab/&4/20xz 0a:f8:fi
到 varchar2
列,这肯定不是有效的日期值。如果 table 中至少有一行 drcr_cr_dt
不代表有效日期,查询将 失败 .
错误意味着 DRCR_CR_DT
是一个字符串,而不是一个真正的日期 - 所以它的数据类型是 VARCHAR2 而不是你说的 DATE。
create table PS_DRCR (DRCR_CR_DT) AS
select '1/4/2022 2:02:54 PM' from dual;
select DRCR_CR_DT
from PS_DRCR
where
TRUNC(DRCR_CR_DT)= TO_DATE('1/4/2022','dd/mon/yyyy');
ORA-00932: inconsistent datatypes: expected NUMBER got DATE
如果它真的是一个日期,它就可以工作——至少,格式模型是固定的,正如@Littlefoot 指出的那样。
如果您坚持将其作为字符串使用(这是一个糟糕的数据模型),那么您需要在截断之前将其转换为日期:
select DRCR_CR_DT
from PS_DRCR
where
TRUNC(TO_DATE(DRCR_CR_DT, 'DD/MM/YYYY HH:MI:SS AM')) = TO_DATE('1/4/2022','dd/mm/yyyy');
DRCR_CR_DT
-------------------
1/4/2022 2:02:54 PM
您还可以与日期文字进行比较:
select DRCR_CR_DT
from PS_DRCR
where
TRUNC(TO_DATE(DRCR_CR_DT, 'DD/MM/YYYY HH:MI:SS AM')) = DATE '2022-04-01';
你得到 ORA-00932 的原因是,在它查看涉及的实际值之前,解析器会看到如下内容:
where TRUNC(<some string>) = TO_DATE(<some string>)
The numeric form of TRUNC "takes as an argument any numeric data type or any nonnumeric data type that can be implicitly converted to a numeric data type", while the date form 仅采用“日期时间数据类型”。这意味着 TRUNC(<some string>)
必须被解释为一个数字。
因此无需查看要转换的任何一个字符串,它就知道转换为:
where <some number> = <some date>
它会在进行任何实际转换之前进行分析,因此不会尝试转换日期字符串;当它确实达到将抛出 ORA-01843 的程度时。