Oracle中根据时间范围查询数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle中根据时间范围查询数据相关的知识,希望对你有一定的参考价值。

参考技术A 1、当时间条件字段为字符串类型的时候,通过以下方法查询数据:
1.1、SELECT * FROM 表名 t WHERE 1=1 AND to_date(t.tkdat,'yyyy/MM/dd')
between to_date('2017/8/1','yyyy/MM/dd') and to_date('2017/11/1','yyyy/MM/dd');
1.2、SELECT * FROM zsd018a t WHERE 1=1 AND to_date(t.tkdat,'yyyy/MM/dd hh24:mi:ss')
between to_date('2017/8/1','yyyy/MM/dd hh24:mi:ss') and to_date('2017/11/1','yyyy/MM/dd hh24:mi:ss');

2、当时间条件为date类型的时候,通过以下方法查询数据:
select * from zmm028 where to_char(tkdat,'YYYY-MM-DD')>='2017-10-01'
and to_char(tkdat,'YYYY-MM-DD')<='2017-11-02' ;

Oracle:需要查询来获取特定范围的数据

【中文标题】Oracle:需要查询来获取特定范围的数据【英文标题】:Oracle: need a query to fetch data for certain range 【发布时间】:2016-04-18 05:29:07 【问题描述】:

数据表

+-------------------------------------------+
| id    start_range     end_range    descr  |
+-------------------------------------------+
| 1        500            550         data1 |
| 2        500            500         data2 |
| 3        510            510         data3 |
+-------------------------------------------+   

所以我需要帮助进行查询,该查询将输入范围值并检查开始和结束范围,如果它位于范围内,则应相应地返回行。

例如

input: 500 output: data2
input: 510 output: data3
input: 502 output: data1
input: 550 output: data1
input: 551 output: null

【问题讨论】:

只是一个友好的提示,您可能需要阅读此页面:The How-To-Ask Guide,这样您就可以始终确保您的问题易于回答且尽可能清晰。请务必包括您为解决遇到的问题所做的任何努力,以及尝试这些修复时发生的情况。也不要忘记您的显示代码和任何错误消息! 所以范围可以重叠。如果一个值匹配两个范围(因为 500 匹配 500-550 和 500-500),选择哪个范围?较小的范围(即 500-500,因为它只包含 1 个数字,而 500-550 包含 51)?但是如果有关系呢? 500 在 450-500 和 500-550 之间。或者你想要一个完全不同的算法来从几个中选择范围?定义规则。 如果我输入那么它应该选择 500-500 的范围,因为它与该范围完全匹配,如果我输入 501 那么它应该选择 500-550 范围......如果我再次输入 510 那么它应该选择 510-510 并忽略 500-550 范围..所以在范围内有可能获得一些与范围完全匹配并且只包含 1 个数字的输入..所以它应该选择最接近的集合。 @a_horse_with_no_name 如果我输入 510,您的查询将失败;然后它将返回 510-510 范围和 500-550 范围的数据 那么没有像 400-410 和 405-415 这样的重叠范围?唯一发生的重叠是存在实数范围,例如 500-550,以及单数“范围,例如 500-500。这是正确的吗? 【参考方案1】:

你可以得到

在 500-550 中匹配 510 的数字 500-500 和 500-550 中的几个匹配为 500 与 551 不匹配

因此,您必须从比赛中选择您认为“最佳”的记录。一种方法是使用ROW_NUMBER 对匹配项进行排名:

select descr 
from
(
  select descr,
    row_number() over (order by end_range - start_range) as rn
  from mytable
  where @value between start_range and end_range
)
where rn = 1;

这会为您提供具有“最佳”描述的行,或者在没有匹配项时为您提供行。

另一个选择是 Oracle 的KEEP DENSE_RANK

select max(descr) keep (dense_rank first order by end_range - start_range)
from mytable
where @value between start_range and end_range;

这为您提供“最佳”描述,如果没有匹配项,则为 NULL。

【讨论】:

以上是关于Oracle中根据时间范围查询数据的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中按照时间范围以及时间间隔抽取数据的问题

Oracle:需要查询来获取特定范围的数据

Oracle sql查询需要根据时区变化

如何根据 Grafana 的绝对时间范围查询数据?

在oracle中怎么判断一个日期是不是在一定时间范围内

oracle日期时间范围查询