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

Posted

技术标签:

【中文标题】不一致的数据类型:预期的 DATE 得到了 NUMBER【英文标题】:Inconsistent Datatypes: Expected DATE got NUMBER 【发布时间】:2018-11-05 18:23:38 【问题描述】:

我正在尝试添加一个 Where 子句,该子句仅从该特定日期获取数据 (trunc(hr, 'dd')) 但是当我输入 HR 的示例值时(类型:DATE WITH TIME ZONE)我收到以下错误:

ORA-00932: inconsistent datatypes: expected DATE got NUMBER

以下是 HR Column 的一些示例数据:

**HR**
25-DEC-16 12.00.00.000000000 AM AMERICA/NEW_YORK
30-DEC-16 06.00.00.000000000 AM US/EASTERN

以下是我的(示例)查询:

select *
  from value v
  where trunc(v.hr, 'dd') = 
        trunc('01-DEC-16 12.00.00.000000000 AM AMERICA/NEW_YORK', 'dd')
    and v.code = 'DEFAULT';

我需要转换一些东西吗?我尝试使用 TO_DATE 函数,但我认为没有适合我的示例数据的日期格式...

提前致谢!

【问题讨论】:

您在字符串上使用 TRUNC(),它需要 DATE 或 TIMESTAMP。 Oracle 中没有数据类型DATE WITH TIMESTAMPDATETIMESTAMP。你用TO_DATE 做了什么尝试——这就是你必须使用的! TRUNC 上的字符串值不存在。 @WernfriedDomscheit 抱歉,我指的是时区。我要修改我原来的问题 TO_TIMESTAMP('代表时间戳的字符串','描述时间戳字符串的格式字符串')。如:TO_TIMESTAMP('01-DEC-16 12.00.00.000000000 am','dd-MON-YY hh.mi.ss.ff9 am') 看起来 -5 让你回到纽约,所以:TO_TIMESTAMP_TZ('01-DEC-16 12.00.00.000000000 am -5','dd-MON-YY hh.mi.ss.ff9我是 tzh') 【参考方案1】:

您的 WHERE 条件存在几个问题。

TRUNC(..., 'DD') 返回一个DATE 值,即您丢失所有时区信息。 我会用这个

WHERE TRUNC(SYS_EXTRACT_UTC(hr)) = TRUNC(SYS_EXTRACT_UTC(TIMESTAMP '2016-12-01 12:00:00 AMERICA/NEW_YORK'))

注意,您可以跳过DD,因为它是默认设置。

【讨论】:

什么时候需要四舍五入到最近的周、月、年等? 然后使用TRUNC'IW', 'MM', 'YYYY' - 或阅读documentation。 哦,很抱歉造成混乱 :( ,我知道那部分(我可以用 google har har,我知道如何将日期截断/舍入到最近的年、月、周等),但是当我提取日期,是否像这样做一样简单?TRUNC(SYS_EXTRACT_UTC(hr),'yyyy')?还是我必须在之前/之后进行一些数据转换?(如果这有意义的话)似乎有点太“容易”了,哈哈。

以上是关于不一致的数据类型:预期的 DATE 得到了 NUMBER的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException:ORA-00932:不一致的数据类型:预期 DATE 在插入 Null 时间戳时得到 BINARY

ORA-00932: 不一致的数据类型: 预期 - 得到 CLOB - 在 regexp_substr 函数中使用 clob

如何修复 PL/SQL:ORA-00932:不一致的数据类型:预期的 CLOB 得到了 -

ORA-00932不一致的数据类型预期 char 得到数字

Oracle 00932. 00000 - “不一致的数据类型:预期的 %s 得到了 %s”

ORA-00932: 不一致的数据类型: 预期 - 得到 - ORA-06512: