【问题标题】:ORACLE SQL - How to check whether a time falls within a particular range?ORACLE SQL - 如何检查时间是否在特定范围内?
【发布时间】:2017-04-27 12:32:06
【问题描述】:

有一列“DateTime”以“YYYY/MM/DD HH24:MI:SS”格式显示日期和时间。 无论特定日期如何,我只需要显示时间在特定范围(2AM - 6AM)内的行。 我有一个代码只显示特定日期的时间范围(凌晨 2 点 - 早上 6 点)。我需要显示过去 7 天内的行,时间范围为 2AM-6AM。

SELECT *
    FROM <table_name >
   WHERE DateTime BETWEEN TO_DATE (
                                    TO_CHAR (TRUNC (SYSDATE), 'DD-MM-YYYY')
                                 || ' '
                                 || '02:00:00',
                                 'DD-MM-YYYY HH24:MI:SS')
                          AND TO_DATE (
                                    TO_CHAR (TRUNC (SYSDATE), 'DD-MM-YYYY')
                                 || ' '
                                 || '06:00:00',
                                 'DD-MM-YYYY HH24:MI:SS')
ORDER BY 1 DESC

【问题讨论】:

  • DATE 数据类型没有格式 - 它在内部存储为 7-bytes(2 代表年,1 代表月、日、小时、分钟和秒)。只有当用户界面(例如 SQL/Plus、SQL 开发人员、TOAD、Java、Python 等)对其进行处理时,才会给它一个格式 - 默认格式是 NLS_DATE_FORMAT 会话参数,这可以是 changed by individual users在他们的会话中。

标签: sql oracle


【解决方案1】:
SELECT *
FROM   your_table
WHERE  TO_CHAR( DateTime, 'HH24MMSS' ) BETWEEN '020000' AND '060000'
AND    DateTime >= TRUNC( SYSDATE ) - INTERVAL '7' DAY
AND    DateTime <  TRUNC( SYSDATE ) + INTERVAL '1' DAY

SELECT *
FROM   your_table
WHERE  DateTime BETWEEN TRUNC( DateTime ) + INTERVAL '2' HOUR
                    AND TRUNC( DateTime ) + INTERVAL '6' HOUR
AND    DateTime >= TRUNC( SYSDATE ) - INTERVAL '7' DAY
AND    DateTime <  TRUNC( SYSDATE ) + INTERVAL '1' DAY

【讨论】:

    【解决方案2】:

    为此,您需要两个条件:一个是在 0205 之间的小时,一个是在过去 7 天内的一天:

    SELECT  *
    FROM    <table_name>
    WHERE   to_char(DateTime, 'HH') BETWEEN '02' and '05' AND
            DateTime BETWEEN SYSDATE - 7 AND SYSDATE
    ORDER BY 1 DESC
    

    【讨论】:

    • Oracle 日期支持算术运算,因此您无需进行字符串比较即可实现此类逻辑。另外,使用日期算术可以让优化器更有效地使用索引(如果有的话)。
    • @JeffreyKemp 你是对的,谢谢!我改进了我的答案
    【解决方案3】:

    在这种情况下,我认为最简单的方法字符串比较:

    WHERE SUBSTR(DateTime, 12, 2) BETWEEN '02' and '05'
    

    注意:Between 包含在内,因此这应该使所有内容都在 05:59:59 之前完成。

    【讨论】:

    • 这依赖于将日期隐式转换为字符串。这在很大程度上取决于 NLS_DATE_FORMAT 的值,因为 Oracle 在转换日期时会将其用作默认格式掩码(在没有显式格式掩码的情况下)。因此,如果将 NLS_DATE_FORMAT 更改为 DD-MON-YYYY HH24:MM:SS,那么这将在不更改查询的情况下失败。
    • @MT0 。 . .绝对不。鉴于语句“有一个列 'DateTime' 显示 'YYYY/MM/DD HH24:MI:SS' 中的日期和时间”,我的假设是该列已经是一个字符串。
    【解决方案4】:
    SELECT *
        FROM <table_name >
       WHERE DateTime BETWEEN TO_DATE (
                                        TO_CHAR (TRUNC (SYSDATE)-7, 'DD-MM-YYYY')
                                     || ' '
                                     || '02:00:00',
                                     'DD-MM-YYYY HH24:MI:SS')
                              AND TO_DATE (
                                        TO_CHAR (TRUNC (SYSDATE), 'DD-MM-YYYY')
                                     || ' '
                                     || '06:00:00',
                                     'DD-MM-YYYY HH24:MI:SS')
    

    【讨论】:

      【解决方案5】:
      select * from table_name where to_char(datetime,'HH24') 
      between '2' and '6' and to_char(datetime,'dd-mon-yy') 
      between to_char(sysdate,'dd-mon-yy')  and to_char(sysdate-7,'dd-mon-yy');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-23
        • 2011-12-21
        • 2020-07-28
        • 2016-05-03
        • 1970-01-01
        • 1970-01-01
        • 2018-04-07
        • 1970-01-01
        相关资源
        最近更新 更多