ORACLE SQL - 如何检查时间是不是在特定范围内?

Posted

技术标签:

【中文标题】ORACLE SQL - 如何检查时间是不是在特定范围内?【英文标题】: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在他们的会话中。 【参考方案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');

【讨论】:

以上是关于ORACLE SQL - 如何检查时间是不是在特定范围内?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用窗口函数检查特定范围值是不是填充在 SQL 中?

oracle sql - 选择具有多个“case when”的语句并检查是不是包含文本

如何在 OLDEB sql 选择命令中检查字段值是不是为特定字符长度?

如何使用 Oracle SQL 约束检查酒店房间是不是已预订

如何检查sql的第一列或第二列中是不是存在一个特定值?

检查表是不是重复的过程 - Oracle PL/SQL