Sql Query使用' Like'正在给出结果,但使用' ='不会在Oracle中返回任何结果

时间:2014-12-17 08:21:25

标签: sql oracle sql-like

使用LIKE查询:(触发此查询时会产生所需的结果)

select * from catissue_audit_event where event_timestamp like '16-DEC-14'

但是当使用'='查询时会产生空结果集

select * from catissue_audit_event where event_timestamp='16-DEC-14'

此处event_timestamp的类型为Date

奇怪的是,查询会针对其他日期运行,例如:

select * from catissue_audit_event where event_timestamp='15-DEC-14'

可能是什么问题?我已经检查了数据中的前导和尾随空格

运行第一个查询后的输出:

Output after running the first query:

3 个答案:

答案 0 :(得分:1)

这种情况不同的原因与您的问题的解决方案不同。

您的问题的解决方案是通过隐式转换为字符串来停止执行日期比较。 Convert your string to a date to perform a date comparison

select * from catissue_audit_event where event_timestamp = date '2014-12-16'

我不能强调这一点; 执行日期比较时比较日期。

您的列EVENT_TIMESTAMP隐含地(这很糟糕)根据您的NLS_DATE_FORMAT转换为日期,您可以按以下方式找到:

select * from nls_session_parameters

这决定了date-data is displayed and implicitly converted的方式。 LIKE工作原因和=之所以没有,是因为您的NLS_DATE_FORMAT正在屏蔽其他数据。换句话说,您的日期有一个时间组件。

如果您运行以下内容,然后从表中重新选择数据,您将看到其他时间组件

alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss'

因此,如果您希望特定日期的所有数据没有时间约束,则您需要删除时间组件:

select * from catissue_audit_event where trunc(event_timestamp) = date '2014-12-16'

答案 1 :(得分:1)

在Oracle中,DATE(当然还有TIMESTAMP)列也包含时间部分。

仅仅因为你的SQL客户端隐藏了时间,并不意味着它不存在。

如果您想要特定日期的所有行(忽略时间),您需要使用trunc()

select * 
from catissue_audit_event 
where trunc(event_timestamp) = DATE '2014-12-16';

请注意,此查询不会使用event_timestamp列上的索引。

您也不应该像使用表达式event_timestamp = '16-DEC-14那样依赖隐式数据类型转换。如果我因为不同的NLS设置从我的计算机运行该语句将失败。始终使用正确的DATE文字(正如我在声明中所做的那样)。如果您不喜欢明确的ISO日期,请使用to_date()

where trunc(event_timestamp) = to_date('16-12-2014', 'dd-mm-yyyy');

除非您知道执行SQL语句的所有环境(包括计算机 SQL客户端)使用相同的NLS设置,否则应避免使用月份名称。如果您确定,可以使用,例如to_date('16-DEC-14', 'dd-mon-yy')

答案 2 :(得分:0)

您是否尝试过匹配event_timestamp格式示例:DD-MMM-YY与您传递的日期?