我正在尝试在 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.
有人能帮我解决这个问题吗?
答案 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