日期之间的SQL查询数据,效率

时间:2018-06-27 16:06:47

标签: sql oracle11g crystal-reports

我正在尝试使用SQL查询来搜索相当大的表(行超过56m)。只能执行如下快速SQL查询的复杂之处:

Select *COLUMNS*
From *Table*
Where *Conditions* And
      LOG_ENTRY_TIMESTAMP between {StartDate} and {EndDate}

是我需要从{StartDate}前一天的23:00-24:00时开始,而不要从该日期开始提取其余数据。 {StartDate}和{EndDate}是用户输入的DATE格式的字段。 LOG_ENTRY_TIMESTAMP是TIMESTAMP数据类型。

是否有比做类似的事情更省时的方法?

TRUNC(CAST(LOG_ENTRY_TIMESTAMP AS DATE), 'HH') BETWEEN {StartDate}-1/24 and {EndDate}+23/24

数据如下:

ITEM   LOG_ENTRY_TIMESTAMP
----   ----------------------------------
A      2/12/2018 10:02:19.214528 AM -0500
B      2/14/2018 11:02:19.224528 PM -0500
C      2/16/2018 01:02:19.412528 AM -0500
D      2/16/2018 11:02:19.412528 PM -0500

如果我从{StartDate} = 2/15/2018到{EndDate} = 2/16/2018进行搜索,我想捕获B&C。

2 个答案:

答案 0 :(得分:0)

我建议:

Where *Conditions* And
      LOG_ENTRY_TIMESTAMP between {StartDate} - 1/24 and {EndDate}

答案 1 :(得分:0)

  

我需要前一天晚上11点到晚上11点之间的数据

     

如果我从{StartDate} = 2/15/2018到{EndDate} = 2/16/2018进行搜索,我想捕获B&C。

假设索引LOG_ENTRY_TIMESTAMP,您可以将其用于:

Where *Conditions* And
  LOG_ENTRY_TIMESTAMP >= {StartDate} -  1/24 and
  LOG_ENTRY_TIMESTAMP <  {EndDate}   + 23/24

再次假设变量实际上是时间设置为午夜的日期,{StartDate} - 1/24给您开始日期前一天的23:00,{EndDate} + 23/24给您结束日期23:00

将示例数据保存在CTE中,并将过滤日期作为日期文字:

with your_table (item, log_entry_timestamp) as (
            select 'A', to_timestamp_tz('2/12/2018 10:02:19.214528 AM -0500',
              'MM/DD/YYYY HH:MI:SS.FF6 AM TZHTZM') from dual
  union all select 'B', to_timestamp_tz('2/14/2018 11:02:19.224528 PM -0500',
              'MM/DD/YYYY HH:MI:SS.FF6 AM TZHTZM') from dual
  union all select 'C', to_timestamp_tz('2/16/2018 01:02:19.412528 AM -0500',
              'MM/DD/YYYY HH:MI:SS.FF6 AM TZHTZM') from dual
  union all select 'D', to_timestamp_tz('2/16/2018 11:02:19.412528 PM -0500',
              'MM/DD/YYYY HH:MI:SS.FF6 AM TZHTZM') from dual
)
select *
from your_table
where LOG_ENTRY_TIMESTAMP >= date '2018-02-15' -  1/24
  and LOG_ENTRY_TIMESTAMP <  date '2018-02-16' + 23/24;

I LOG_ENTRY_TIMESTAMP              
- ---------------------------------
B 2018-02-14 23:02:19.224528 -05:00
C 2018-02-16 01:02:19.412528 -05:00

但是您需要验证用于变量的值的实际数据类型,以及是否正在进行任何时区转换,这可能会影响您实际匹配的值范围。