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】:为此,您需要两个条件:一个是在 02
和 05
之间的小时,一个是在过去 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 - 如何检查时间是不是在特定范围内?的主要内容,如果未能解决你的问题,请参考以下文章
oracle sql - 选择具有多个“case when”的语句并检查是不是包含文本
如何在 OLDEB sql 选择命令中检查字段值是不是为特定字符长度?