预期数据类型不一致 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
我正在尝试 运行 在 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