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 TABLEINSERT 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:fivarchar2 列,这肯定不是有效的日期值。如果 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';

db<>fiddle


你得到 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 的程度时。