【问题标题】:How to filter particular time period in oracle如何在oracle中过滤特定时间段
【发布时间】:2019-03-23 13:03:11
【问题描述】:

我有一个格式为'5/23/2018 3:35:18 PM' 的日期和时间列(Login_time)。我想过滤八月月份和时间段为6.30 to 7.30 的行。我可以使用Login_time >= to_date('08/1/2018','MM/DD/YYYY') and Login_time >= to_date('08/31/2018','MM/DD/YYYY') 过滤八月月份,但现在我只想要早上 6.30 到早上 7.30 之间的行。

【问题讨论】:

  • 您的月份逻辑不好 - 您在 8 月 31 日午夜后丢失了所有登录信息。您可以将其更改为 < 9/1,或者您可以使用 trunc 代替:trunc(login_date, 'Month') = date '2018-08-01'
  • 我希望你没有一个“格式”的Login_time列(这将是一个字符串),而是存储为datetimestamp(可以显示to_char) 有多种不同的格式。
  • 什么是列数据类型 - 日期、时间戳或(希望不是)varchar2?此外,您是否真的想包含正好 07:30:00 的值,还是只包含 07:29:59(.999...如果它是时间戳)?

标签: oracle date select filter


【解决方案1】:

注意日期/时间范围。您通常希望包括开始时间并排除结束时间,例如从 2018-08-01 到 2018-09-01 之前的所有行,因此包括整个最后一天,无论离午夜多近。这是整个查询:

select *
from mytable
where login_time >= date '2018-08-01' 
  and login_time < date '2018-09-01' 
  and to_char(login_time, 'hh24:mi') >= '06:30'
  and to_char(login_time, 'hh24:mi') < '07:31';

【讨论】:

    【解决方案2】:

    您可以将列的时间部分格式化为字符串,然后按词典进行比较:

    TO_CHAR(login_time, 'HH24:MI:SS') BETWEEN '06:30:00' AND '07:30:00' 
    

    【讨论】:

      【解决方案3】:

      您只需包括时间:

      Login_time >= to_date('08/01/2018 06:30:00','MM/DD/YYYY HH24:MI:SS') 
       and Login_time <= to_date('08/31/2018 07:30:59','MM/DD/YYYY HH24:MI:SS') 
        and to_char(login_time, 'hh24:mi:ss') >= '06:30:00'
        and to_char(login_time, 'hh24:mi:ss') <= '07:30:59'
      

      EXTRACT(MONTH FROM CAST(Login_time AS TIMESTAMP)) = 8 
        and to_char(login_time, 'fmSSSSS') between 6*60*60 + 30*60 AND 7*60*60 + 30*60 
      

      【讨论】:

      • 这没有解决每天早上 6:30 到 7:30 之间只显示行的要求。
      【解决方案4】:

      我对“早上 6:30 到早上 7:30”的要求采取了不同的方法。在这个答案中,我减去 30 分钟,然后检查小时值是 6 还是 7。我选择这种方法作为字符串比较的变体。我不知道它是否表现更好,但它是一种替代方法。要提取小时值,必须转换为时间戳。

       WHERE trunc(login_time) BETWEEN to_date('8/1/2018', 'mm/dd/yyyy') AND to_date('8/31/2018', 'mm/dd/yyyy')
         AND extract(hour FROM cast(login_time-(30/60/24) as timestamp)) IN (6,7)
      

      如果您总是要查询整个月,则可以缩短为

       WHERE trunc(login_time, 'MONTH') = to_date('8/1/2018', 'mm/dd/yyyy')
         AND extract(hour FROM cast(login_time-(30/60/24) as timestamp)) IN (6,7)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-20
        • 2021-03-02
        • 2020-07-31
        • 1970-01-01
        • 2019-07-11
        相关资源
        最近更新 更多