`

如何用SQL返回两个日期之间的所有连续日期

阅读更多
如何用SQL返回两个日期之间的所有连续日期
-------------------------------------------


在层次查询中,Oracle引入了一个伪列level,用来表示当前行(节点)对应的level,
它从1开始计数,每多一层level的值就加1。
我们可以据此实现对两个日期/整数之间所有日期/整数的遍历。
----------------------------------------------------------
SQL> create table test (begin_date date,end_date date);

Table created

SQL> insert into test values(trunc(sysdate),trunc(sysdate+5));

1 row inserted

SQL> select * from test;

BEGIN_DATE  END_DATE
----------- -----------
2010-4-6    2010-4-11

SQL> select begin_date,end_date,begin_date+level -1 as today
  2  from test
  3  connect by begin_date + level -1 <= end_date;

BEGIN_DATE  END_DATE    TODAY
----------- ----------- -----------
2010-4-6    2010-4-11   2010-4-6
2010-4-6    2010-4-11   2010-4-7
2010-4-6    2010-4-11   2010-4-8
2010-4-6    2010-4-11   2010-4-9
2010-4-6    2010-4-11   2010-4-10
2010-4-6    2010-4-11   2010-4-11

6 rows selected

------------------------------------------------------------------插入两条记录,看该查询语句是否可行
SQL> insert into test values(trunc(sysdate+4),trunc(sysdate+7));

1 row inserted

SQL> select * from test;

BEGIN_DATE  END_DATE
----------- -----------
2010-4-6    2010-4-11
2010-4-10   2010-4-13

SQL> select distinct begin_date+level-1 as today
  2  from test
  3  connect by begin_date+level-1 <= end_date;

TODAY
-----------
2010-4-7
2010-4-13
2010-4-8
2010-4-11
2010-4-9
2010-4-6
2010-4-10
2010-4-12

8 rows selected
--------------------------------------- 根据最大和最小值得查询
SQL> delete from test where begin_date = to_date('2010-4-10','yyyy-mm-dd');

1 row deleted

SQL> select * from test;

BEGIN_DATE  END_DATE
----------- -----------
2010-4-6    2010-4-11


SQL> SELECT one_date
  2    FROM (SELECT start_date + level - 1 one_date
  3            FROM (SELECT min(begin_date) start_date, max(end_date) end_date
  4                    FROM test) test
  5          connect BY start_date + level - 1 <= end_date ) all_date,
  6         test
  7   WHERE one_date BETWEEN begin_date AND end_date;

ONE_DATE
-----------
2010-4-6
2010-4-7
2010-4-8
2010-4-9
2010-4-10
2010-4-11

6 rows selected
分享到:
评论

相关推荐

    Java 连续日期周期作为sql查询条件

    例如,我们可以使用`LocalDate`来表示一个特定的日期,并使用`Period`或`Duration`来表示两个日期之间的间隔。 在SQL查询中,连续日期周期通常涉及`BETWEEN`关键字或者使用日期函数来计算区间。例如,以下是一个...

    经典SQL脚本大全

    │ 任意两个时间之间的星期几的次数-横.sql │ 任意两个时间之间的星期几的次数-纵.sql │ 复杂年月处理.sql │ 统计--交叉表+日期+优先.sql │ ├─第03章 │ │ 3.2 各种字符串分拆处理函数.sql │ │ 3.3 各种...

    Sqlserver2000经典脚本

    │ 2.5.3 工作日处理函数(自定义节假日).sql │ │ 2.5.4 计算工作时间的函数.sql │ │ │ └─其他 │ 交叉表.sql │ 任意两个时间之间的星期几的次数-横.sql │ 任意两个时间之间的...

    sql高级进阶

    - 确定两个日期之间的工作天数目:使用数据库函数排除周末和节假日。 - 计算一年中周内各日期的次数:统计一年中各周内某天的出现频率。 - 确定当前记录和下一条记录之间相差的天数:使用数据库的日期差函数。 8...

    T-sql 官方文档

    - **`DATEDIFF`**: 计算两个日期/时间之间的差值。 - **`DATEDIFF_BIG`**: 类似于DATEDIFF,但可以处理更大的范围。 - **`DATEFROMPARTS`**: 从年、月、日构建日期。 - **`DATENAME`**: 返回日期/时间表达式的指定...

    SQLSERVER时间函数汇总

    3. DATEDIFF():计算两个日期或时间之间的差异,可以按天、小时、秒等单位返回差值。 4. DATEPART():从日期或时间表达式中提取特定部分,如年、月、日、小时等。 5. DATEFROMPARTS()和TIMEFROMPARTS():根据各个...

    19道日期函数计算题130902

    例如,在SQL中,`DATEADD`和`DATEDIFF`函数分别用于增加日期和计算两个日期之间的差值。 2. **日期格式化**:将日期转换为特定的字符串格式是另一个常见的需求,这可能涉及到提取特定部分(如年、月、日)或者使用...

    SQLServer2005函数大全

    - `DATEDIFF()`:计算两个日期之间的差异(以指定的时间单位计)。 - `DATEPART()`:提取日期或时间的特定部分,如年、月、日等。 - `DATEFROMPARTS()`:根据给定的年、月、日创建日期。 - `TIMEFROMPARTS()`:...

    Oracle Sql基础 Oracle Sql基础 Oracle Sql基础

    - SQL默认会返回所有匹配的结果行,包括重复的行。如果需要去除重复的数据,可以使用DISTINCT关键字。 **1.5 iSQL\*Plus简介** - **1.5.1 iSQL\*Plus概览** - iSQL*Plus是Oracle提供的一个命令行工具,用于执行...

    收集整理的SQL Server自定义函数

    23.计算两个日期之间的工作日 43 24.根据年月生成日历函数 44 25.从第一个汉字开始分割字符串 47 26.过滤掉字符串中重复的字符 47 27.根据日期得到星期的函数 48 28.根据年度判断是否是闰年 49 29.完善SQL农历转换...

    用My SQL查询连续的数字(连续出现问题)

    此查询将返回所有至少连续出现3次的分数,且不会包含重复的分数值。 总结来说,解决连续数值查询的问题,主要涉及以下几个步骤: 1. 创建一个包含连续数值的表结构。 2. 插入模拟数据,以反映连续出现的数值情况。 ...

    mysql计算连续天数,mysql连续登录天数,连续天数统计

    `NOT EXISTS`子句确保了没有其他登录记录在这两个日期之间,从而保证了连续性。 为了实现一个通用的MySQL函数,我们可以创建一个存储过程,接受用户ID和开始日期作为参数,返回最长连续登录天数。例如: ```sql ...

    expert t_sql window functions in sql server

    4. **FIRST_VALUE()和LAST_VALUE()**:这两个函数分别返回指定列在窗口中的第一个和最后一个值,这对于计算趋势变化或查找序列中的异常值很有帮助。 5. **PERCENT_RANK()和CUME_DIST()**:这些函数提供相对排名和...

    oracle—SQL技巧之(一)连续记录查询sql案例测试

    上述SQL查询的结果将返回每组连续日期的起始年份、起始日期、结束日期以及日期连续的天数。通过`MIN(TDATE)`和`MAX(TDATE)`,我们可以确定连续日期的范围;`COUNT(TYEAR)`则表示该连续日期的天数。 5. **应用场景*...

    SQL分析函数

    例如,`AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING)` 计算了每个经理下的员工,按照入职日期排序,当前员工及其前后两个员工的平均薪资。 总之,SQL...

    esql/c 总结 c中嵌入sql esql/c总结 比较 笔记 详细

    - `bycmpr()`:比较两个连续的字节内存块。 - `bycopy()`:复制内存块内容。 - `byfill()`:用指定字符填充内存块。 - `byleng()`:统计去除末尾空格的有效字符数。 3. **字符串操作函数**: - `ldchar()`:从...

    通过年月查询工作日期

    初始化了两个日期变量 `@begin_date` 和 `@end_date` 来界定日期的范围。 ```sql INSERT INTO @tb (a) SELECT TOP 366 0 FROM sysobjects a, sysobjects b ``` 通过插入 366 行数据到 `@tb` 中,以便后续生成日期...

    SqlServer数据库语句大全

    - `JOIN` 用于将两个或多个表的数据组合在一起。 - `ON` 子句指定了连接条件。 **2.5 汇总查询(Group Query)** **语法:** ``` SELECT column_name, aggregate_function(column_name) FROM table_name GROUP BY ...

    学习sql资料

    - SQL语句中的注释通常使用两个连续的短划线(--)来添加注释文本,以提高SQL代码的可读性。 - 使用事务控制语言(TCL)来确保数据的一致性和完整性,特别是在涉及多个操作的场景下。 - 为了避免SQL注入等安全风险,...

    2009达内SQL学习笔记

    在处理SQL语句时,其中所有的空格都被忽略(空格只用来分开单词,连续多个空格当一个用)。 SQL语句可以在一行上写出,建议多行写出,便于阅读和调试。 多条SQL语句必须以分号分隔。多数DBMS不需要在单条SQL语句后...

Global site tag (gtag.js) - Google Analytics