【问题标题】:Strange behaviour when filtering by date in Oracle在 Oracle 中按日期过滤时的奇怪行为
【发布时间】:2015-10-28 03:52:39
【问题描述】:

我在 Oracle 数据库上,以下查询:

select codi_belf, data_elab,id_inte,anno from mimsspam_tab where id_inte = 504;

检索 6 条记录

E924 05-AGO-15 504 2015 D458 05-AGO-15 504 2015 D458 05-AGO-15 504 2015 B275 05-AGO-15 504 2015 E924 05-AGO-15 504 2015 B275 05-AGO-15 504 2015

其中“data_elab”是 DATE 类型的字段,AGO 只是 AUG 的意大利语言环境。

我尝试像这样按日期过滤:

select codi_belf, data_elab,id_inte,anno 
from mimsspam_tab where id_inte = 504 
and data_elab = TO_DATE('05/08/2015','dd/MM/yyyy');

我没有得到任何结果..

此外,如果我这样过滤:

select codi_belf, data_elab,id_inte,anno  
from mimsspam_tab where id_inte = 504 
and TO_CHAR(data_elab,'dd/MM/yyyy')='05/08/2015';

我拿回了我的六张唱片!

这两种过滤方式不应该是等价的吗?为什么他们不是?为什么第一个吃掉了我所有的六张唱片? 这可能取决于我要查询的 oracle 安装的奇怪配置吗?

【问题讨论】:

  • 在您的选择中,在该日期使用 to_char,格式包括小时和分钟。
  • thisthis 或许多其他的可能重复。

标签: oracle date to-date to-char


【解决方案1】:

听起来您的 data_elab 列有时间元素,当您选择该列时,您的默认 nls_date_format 设置导致不显示。

如果 data_elab 上没有索引,则以下内容应返回行:

and trunc(data_elab) = TO_DATE('05/08/2015','dd/MM/yyyy');

如果 data_elab 上有一个索引,并且您希望使用它,那么以下应该可以工作:

and data_elab >= TO_DATE('05/08/2015','dd/MM/yyyy')
and data_elab < TO_DATE('06/08/2015','dd/MM/yyyy')

【讨论】:

    【解决方案2】:

    您在第一个查询中看到的是您的数据库默认日期格式,由您的 NLS 参数确定。您的日期字段实际上包含时间信息,您只是看不到它。

    在您的第二个查询中,当您使用to_date() 时,您将string 转换为date 并且不提供时间信息,因此您在date 的时间部分得到00:00:00。将其与您的字段(包括时间信息)进行比较会导致不匹配。

    在您的第三个查询中,当您使用to_char() 时,您将日期字段转换为不包含时间信息的string。将其与您的文字 string 进行比较,您会得到匹配的记录。

    尝试将日期字段视为二进制信息,而不是字符串。尽量不要依赖数据库默认参数。

    【讨论】:

    • @Boneist 和你都是对的。如果我从表中选择一个 to_char(data_elab,'dd/mm/yyyy hh:mm:ss') 我可以看到时间信息,例如 05/08/2015 11:08:31
    猜你喜欢
    • 2015-05-11
    • 2012-12-16
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    相关资源
    最近更新 更多