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

时间:2021-03-24 09:57:28

标签: sql oracle date truncate

我正在尝试在 Oracle 中运行此查询,因为我需要提取日期在上个月相对于 sysdate 的数据。这是我写的:

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

查询不起作用并返回以下消息:

inconsistent datatypes: expected NUMBER got DATE.

有人能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

假设您做了一些不是最佳实践的事情,并且您的 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' )(使用任何合适的格式模型),但不要这样做,因为这是一个快速解决方案,无法解决您使用不适当数据类型的根本问题。< /p>

db<>fiddle here

相关问题