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

Posted

技术标签:

【中文标题】使用 \'Like\' 的 Sql Query 正在给出结果,但使用 \'=\' 不会在 Oracle 中返回任何结果【英文标题】:Sql Query using 'Like' is giving results but using '=' does not returns any result in Oracle使用 'Like' 的 Sql Query 正在给出结果,但使用 '=' 不会在 Oracle 中返回任何结果 【发布时间】:2014-12-17 08:21:24 【问题描述】:

使用 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'

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

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

【问题讨论】:

你能分享你从第一个查询中得到的示例输出吗? ***.com/questions/13337635/… 您是否尝试过使用 TO_DATE 将时间戳转换为日期? 我正在使用相同的查询获取“15-DEC-14”的数据,但在检索“16-DEC-14”的结果时遇到了问题 @Panter 请看编辑 【参考方案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')

【讨论】:

但是为什么当我使用 '=' 在查询中传递一些其他日期(例如 '15-DEC-14')时会得到结果 @Abhishek:也许你确实有一些date 值在那天有时间00:00:00。您需要在 SQL 客户端中更改日期(和时间戳)的 dispaly 格式才能看到。【参考方案2】:

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

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

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

这点我怎么强调都不为过; 在执行日期比较时比较日期。

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

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'

【讨论】:

明白你的意思,但是为什么当我在使用 '=' 的查询中传递一些其他日期(例如 '15-DEC-14')时会得到结果【参考方案3】:

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

【讨论】:

在检索其他条目时没有遇到任何问题 没有日期“格式”之类的东西(如果有的话,应该是DD-MON-YY @Ben 这里是你格式化 SQL 查询的方式,你可以从 Select * from tablename where FORMAT(event_timestamp,'DD-MMM-YY') = '15-DEC-14' 开始,他说 SQL Query not Oracle,如果它是 oracle,你可以像这样使用 to_char 方法: TO_CHAR(vent_timestamp, 'DD-MMM-YY') 但是 Abhishek 我不知道为什么它不适合你。

以上是关于使用 'Like' 的 Sql Query 正在给出结果,但使用 '=' 不会在 Oracle 中返回任何结果的主要内容,如果未能解决你的问题,请参考以下文章

使用LIKE子句正确格式化sql查询

准备好的 SQL LIKE 语句不返回所有结果

带有 LIKE 的 Spring JPA @Query

如何在带有 php 用户输入的 SQL 中使用 like 运算符? [复制]

Excel - Microsoft Query 的页外引用

使用 LIKE 子句搜索 Mysql