【问题标题】:Oracle date comparison using to_date not working使用 to_date 的 Oracle 日期比较不起作用
【发布时间】:2017-04-26 06:38:58
【问题描述】:

我在我的机器上使用 Oracle XE。
将表定义为:

Name       Type
ENAME      VARCHAR2(20) 
DOJ        DATE  

触发一个简单的选择:

从 test1.tasty1 中选择 *;

ENAME                DOJ
sat                  08-DEC-16 

好吧 - 我知道 DATE 字段中包含时间组件。
以下使用 TRUNC 的查询工作正常:

select * from test1.tasty1 where trunc(DOJ) = '08-DEC-16';

现在我想测试 'to_date' 函数 - 但以下查询均无效 - 想知道为什么?

select * from test1.tasty1 where DOJ = to_date('08-12-2016','DD-MM-YYYY');
select * from test1.tasty1 where DOJ = to_date('08-DEC-2016','DD-MON-YYYY');
选择 * 从 test1.tasty1 where DOJ = to_date('08-DEC-16','DD-MON-YY');
选择 * 来自 test1.tasty1 where DOJ = to_date('08-DEC-16','dd-mon-RR');

在 SO 上看过以下内容:
Oracle TO_DATE not working

所以不确定这里有什么问题?

【问题讨论】:

  • 请尝试以下查询:SELECT * FROM test1.tasty1 WHERE DOJ = '2016-08-12' ... 这会返回任何内容吗? AFAIK 您尝试的 4 个查询中的一些应该返回该记录。
  • 如果我尝试 'select * from test1.tasty1 where DOJ = '08-DEC-16';',上述失败并显示 'literal does not match format string'没有结果
  • 这不是我要求你运行的。我让你跑WHERE DOJ = '2016-08-12'
  • 好吧,如果你读了我的回复-我确实回复说它失败了'字面不匹配格式字符串'
  • 您确定DOJdate 列吗?这是我在这里看到的非常奇怪的行为。

标签: oracle date


【解决方案1】:

从您的问题和 cmets 看来,这似乎是发生的一系列事件。

您在表中执行了以下INSERT

INSERT INTO test1.tasty1 VALUES ('sat', SYSDATE)

请记住,Oracle 中的日期同时具有日期时间组件。因此,即使您确实插入了日期'2016-12-08',您插入了一个时间组件。因此,以下查询没有返回任何记录:

SELECT * FROM test1.tasty1 WHERE DOJ = '2016-08-12'

这可能是因为您从未指定时间组件,因此您之前插入的记录不匹配。如果只想比较日期部分,可以使用TRUNC,如下:

SELECT * FROM test1.tasty1 WHERE TRUNC(DOJ) = '2016-08-12'

如果您真的只想处理日期组件,解决您的问题的解决方案是在插入过程中将SYSDATETRUNC 包装起来。

顺便说一下,用作文字的格式'08-DEC-16' 不会被Oracle 识别为有效日期。请改用'2016-12-08'

【讨论】:

  • Tim - 谢谢 - 我得到了时间部分和使用 TRUNC 的需要。这是可以理解的。我不明白的是 - 这是否意味着如果涉及时间组件(在我的示例中),TO_DATE 将不起作用?
  • @satishmarathe 在您的情况下,您进行比较的列 确实 有一个时间组件,所以如果您不匹配,那么比较无法正常工作。但是,如果您将没有时间组件的截断日期与同样没有时间组件创建的 to_date 进行比较,那么我希望比较能够工作。
  • 好的,所以现在它是有道理的 - to_date 还将考虑“时间”方面,并且由于我们正在进行比较(不大于或小于) - 它尝试进行完全匹配- 这引发了另一个问题 - 如果我只是想使用日期字段并且对时间不感兴趣 - 我应该使用什么数据类型 - 将阅读,如果需要 - 发布一个单独的问题 - 感谢您的输入
【解决方案2】:

你有没有试过这样比较日期和日期是正确的:

select * from test1.tasty1 where to_date(DOJ,'DD-MM-YYYY') = to_date('08-12-2016','DD-MM-YYYY');

比较苹果和苹果而不是芒果。

【讨论】:

  • Oracle 建议不要将 Date 对象传递给您在 LHS 和 FYI 上推荐的 to_date - 您建议的 SQL 也没有给出任何结果 - 苹果与苹果的比较返回了橘子! :)。根据@TimBiegeleisen 的说法,这是有道理的 - 这里涉及到一个时间组件
猜你喜欢
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多