【问题标题】:to_date is not returning datato_date 没有返回数据
【发布时间】:2021-09-17 21:20:49
【问题描述】:

由于以下条件,我有一个查询没有返回任何数据

where  fcc_cust_addr_evnt.MIS_DATE = to_date(? , 'MM/DD/YYYY'). 

数据以这种 DD-MON-YYYY 格式存储在 MIS_DATE 列的表中。

我怎样才能达到预期的效果。

【问题讨论】:

  • 什么是?MIS_DATE 的数据类型是什么?这与 PL/SQL 或 SQL Developer 有什么关系?

标签: sql plsql oracle-sqldeveloper


【解决方案1】:

在 Oracle 中,日期具有时间部分。所以,MIS_DATE 有可能有时间分量,所以= 不起作用。

如果是这样,那么这样的逻辑将起作用:

where trunc(fcc_cust_addr_evnt.MIS_DATE) = to_date(? , 'MM/DD/YYYY')

trunc() 函数删除了时间分量。

【讨论】:

    【解决方案2】:

    使用trunc() 将阻止使用该列上的索引;如果您可能需要做很多事情,您可以添加一个基于函数的索引。但是如果有一个索引并且你想继续使用它,那么你可以寻找一个范围:

    where fcc_cust_addr_evnt.MIS_DATE >= to_date(? , 'MM/DD/YYYY')
    and fcc_cust_addr_evnt.MIS_DATE < to_date(? , 'MM/DD/YYYY') + 1
    

    将查找从当天午夜到第二天午夜的所有时间。该模式也适用于时间戳。

    如果您不想将值传递两次 - 使用两个绑定占位符 - 您可以添加一个具有一个的 CTE,然后在主查询中引用该 CTE 中的值。

    如果您的应用程序中有实际日期,通常也最好绑定它们,而不是转换成字符串传入,然后再转换回日期;但这取决于您的应用程序所持有的数据类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多