预期数据类型不一致 NUMBER 得到 DATE

Inconsistent datatypes expected NUMBER got DATE

我正在尝试 运行 在 Oracle 中执行此查询,因为我需要提取日期在 sysdate 之前一个月内的数据。这是我写的:

SELECT ID, BALANCE, DATE
FROM MY_TABLE
WHERE TRUNC(DATE, 'mm') = TRUNC(ADD_MONTHS((SYSDATE),-1),'mm');

查询无效,returns出现以下消息:

inconsistent datatypes: expected NUMBER got DATE.

谁能帮我解决这个问题?

假设您做了一些不符合最佳实践的事情,并且您的 DATE 列具有 NUMBER 数据类型(或 VARCHAR2):

CREATE TABLE my_table ( id NUMBER, balance NUMBER, "DATE" NUMBER );

INSERT INTO my_table ( id, balance, "DATE" ) VALUES ( 1, 100, 20210207012345 );

那么您的查询:

SELECT ID, BALANCE, "DATE"
FROM MY_TABLE
WHERE TRUNC("DATE", 'mm') = TRUNC(ADD_MONTHS((SYSDATE),-1),'mm');

输出:

ORA-00932: inconsistent datatypes: expected NUMBER got DATE

不足为奇,因为 "DATE" 列是 NUMBER 而不是 DATE(或者如果您使用 VARCHAR2,则 TRUNC 将隐式转换字符串到 NUMBER 以便它可以将其截断,就好像它是十进制值一样)。错误消息告诉您该怎么做...重新定义 "DATE" 列,以便数据类型与存储在该列中的数据相匹配,即作为 DATE 数据类型。

CREATE TABLE my_table ( id NUMBER, balance NUMBER, "DATE" DATE );

INSERT INTO my_table (
  id, balance, "DATE"
) VALUES (
  1, 100, DATE '2021-02-07' + INTERVAL '01:23:45' HOUR TO SECOND
);

那么您的查询:

SELECT ID, BALANCE, "DATE"
FROM MY_TABLE
WHERE TRUNC("DATE", 'mm') = TRUNC(ADD_MONTHS((SYSDATE),-1),'mm');

工作,输出:

ID | BALANCE | DATE               
-: | ------: | :------------------
 1 |     100 | 2021-02-07 01:23:45

您也可以在查询中使用 TRUNC( TO_DATE( "DATE", 'YYYYMMDDHH24MISS' ), 'MM' )(使用合适的格式模型),但不要这样做,因为这是一个快速修复,无法解决您使用不适当数据类型的根本问题.

db<>fiddle here