【问题标题】:Issue querying date from oracle.从 oracle 发出查询日期。
【发布时间】:2015-08-16 14:24:52
【问题描述】:

我了解查询日期将失败,因为它将字符串与日期进行比较,这可能会导致问题。

甲骨文 11.2 G 统一码数据库 NLS_DATE_FORMAT DD-MON-RR

select * from table where Q_date='16-Mar-09'; 

可以解决

select * from table where trunc(Q_date) = TO_DATE('16-MAR-09', 'DD-MON-YY');

我不明白为什么会这样。

select* from table where Q_date='07-JAN-08';

如果有人可以详细说明或纠正我的心态。 谢谢

【问题讨论】:

  • 第一个查询是返回错误还是不返回任何结果?
  • 对不起,我应该澄清一下。第一个不返回任何行。第二个返回该日期的所有行。第三个返回该日期的所有行。有与 2009 年 3 月 16 日相关的行。

标签: sql sqldatatypes oracle11gr2


【解决方案1】:

Oracle确实允许使用日期文字,但它们取决于安装(特别是 NLS_DATE_FORMAT 的值,如 here 所述)。因此,没有将单个字符串解释为日期的通用格式(除非您使用 DATE 关键字)。

默认格式是 DD-MM-YY,这似乎是您服务器的格式。所以,你的声明:

where Q_date = '07-JAN-08'

使用这种格式进行解释。

我更喜欢使用带有 ISO 标准 YYYY-MM-DD 格式的 DATE 关键字:

where Q_Date = DATE '2008-01-07'

【讨论】:

  • 谢谢。正如我所说,我已经检查了数据库的 NLS_DATE_FORMAT,它是 DD-MON-RR。抱歉,我正在尝试帮助通过即时消息客户端进行通信的人。
  • @KyleK 。 . . '07-JAN-08' 是“DD-MON-RR”格式的有效日期。因此,转换工作没有错误。
【解决方案2】:

如果没有返回任何行:

select * from table where Q_date='16-Mar-09'; 

但这确实看到了数据:

select * from table where trunc(Q_date) = TO_DATE('16-MAR-09', 'DD-MON-YY');

那么您的行的时间不是午夜。在本世纪的这一点上,DD-MON-RR 和 DD-MON-YY 是等价的,两者都将 09 视为 2009,因此日期部分是正确的。但第一个只会找到时间为午夜的行,而第二个是通过trunc 剥离时间,这意味着双方的日期都在午夜,因此相等。

因为这也能找到数据:

select* from table where Q_date='07-JAN-08';

...那么您在该日期的午夜有行。您可能有其他时间的行,因此使用 trunc 版本检查计数可能很有用。

您可以检查您实际拥有的时间:

select to_char(q_date, 'YYYY-MM-DD HH24:MI:SS') from table;

如果您确实想确保在一天内捕捉到所有时间,您可以使用范围:

select * from table where
q_date >= date '2009-03-16'
and q_date < date '2009-03-17';

Quick SQL Fiddle demo.

虽然听起来您一直希望是午夜,但这可能表明存在数据问题。

【讨论】:

    猜你喜欢
    • 2011-01-23
    • 2014-06-09
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 2015-04-28
    • 2013-07-02
    • 2014-05-20
    • 2018-07-29
    相关资源
    最近更新 更多