Oracle:今天上午12点之前获取所有内容的结果

时间:2018-03-21 19:44:58

标签: sql oracle

      WHERE (internalagentname is not null or internalagentcode is not null)
      and (source LIKE '%GETAWAY%' or source like '%VACATION%')  
      and initialbookingdate <= to_Date(to_char(sysdate-1,'MM/DD/YYYY'), 
      'MM/DD/YYYY')
      and  (ABS(total_revenue) + ABS(total_cost) + ABS(booking_adjustment))<>0

所以,这是我最后一步查询我是从昨天的日期提取数据。不幸的是,它读取这个为sysdate - 1(从当前时间)以及为什么它也有来自今天当前日期的数据,我怎么能改变这个以便它只从上午12点和之前取出数据?谢谢

3 个答案:

答案 0 :(得分:3)

您应该只使用逻辑:

initialbookingdate < trunc(sysdate - 1)

问题是<=。当前时间与问题无关,因为转换中没有时间组件返回日期。然而,你的表达方式比它需要的更复杂。

答案 1 :(得分:0)

说你需要属于“昨天”的数据,看看这个:

SQL> select
  2    sysdate right_now,
  3    trunc(sysdate) todays_midnight,
  4    trunc(sysdate - 1) yesterdays_midnight
  5  from dual;

RIGHT_NOW           TODAYS_MIDNIGHT     YESTERDAYS_MIDNIGHT
------------------- ------------------- -------------------
21.03.2018 21:31:46 21.03.2018 00:00:00 20.03.2018 00:00:00

SQL>

这意味着一个选项是选择initialbookingdate介于“yesterdays_midnignt”和“todays_midnight”之间的值,即

where initialbookingdate between trunc(sysdate - 1) and trunc(sysdate)

(请注意,BETWEEN 包含)。

一个更简单的选项,它会破坏你在initialbookingdate上可能拥有的索引(所以 - 虽然更简单,但要谨慎使用它。在小数据量上你不会看到问题,但是当处理很多行时 - 是的,你会)

where trunc(initialbookingdate) = trunc(sysdate - 1)

答案 2 :(得分:0)

尝试在查询条件中使用以下代码,

ALTER SESSION SET NLS_DATE_FORMAT = 'MM/DD/YYYY HH:MI:SS AM';

SELECT TRUNC(sysdate)-(.00019/24) date_ 
  FROM dual;

DATE_                
----------------------
03/21/2018 11:59:59 PM