【问题标题】:Inconsistent datatypes expected NUMBER got DATE预计 NUMBER 得到 DATE 的数据类型不一致
【发布时间】:2021-03-24 09:57:28
【问题描述】:

我正在尝试在 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.

谁能帮我解决这个问题?

【问题讨论】:

  • 无法复制您的问题db<>fiddle。请edit 您的问题添加minimal reproducible example 与:my_table 表的 DDL (CREATE TABLE) 语句;以及用于演示问题的示例数据的 DML (INSERT) 语句。
  • 看起来你的“日期”列实际上是一个字符串,这不是一个好主意。 (您可以在this modified db<>fiddle 上看到相同的错误。)将列数据类型更改为实际日期,或者如果由于某种原因确实不能,则需要在截断之前将该字符串转换为日期。
  • 请提供样本数据和期望的结果。明确date 的数据类型。
  • "我的日期字段是 NVARCHAR(2)" - 那么你在这两个字符中持有什么;一个月数?您是否还有另一列包含年份数字?

标签: sql oracle date truncate


【解决方案1】:

假设您做了一些不是最佳实践的事情,并且您的 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');

工作和输出:

身份证 |余额 |日期 -: | ------: | :----------------- 1 | 100 | 2021-02-07 01:23:45

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

db小提琴here

【讨论】:

  • 是的,我可以确认我的日期字段是 NVARCHAR(2),并且我没有修改它或创建临时表的权限。
  • @SalvatoreVitale 然后去请有权修改它的人将其更改为准确表示它所持有的数据的合理数据类型。或者,使用TO_DATE(正如我在上一段中提到的)。但正确的解决方案应该是修复您的数据模型。
猜你喜欢
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 2013-05-31
  • 2019-07-24
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多