`

(转)合并时间按段sql-备忘

阅读更多

假设有一张考勤单,经常需要将连续或重叠的时间段合并。在做简单查询时这可能成为问题,所以要当心,这个问题并不容易领会或理解:

 

CREATE TABLE Timesheets

 

(task_id CHAR(10) NOT NULL PRIMARY KEY,

 

 start_date DATE NOT NULL,

 

 end_date DATE NOT NULL,

 

 CHECK(start_date <= end_date));

 

INSERT INTO Timesheets

 

VALUES (1,  '1997-01-01', '1997-01-03'),

 

       (2,  '1997-01-02', '1997-01-04'),

 

       (3,  '1997-01-04', '1997-01-05'),

 

       (4,  '1997-01-06', '1997-01-09'),

 

       (5,  '1997-01-09', '1997-01-09'),

 

       (6,  '1997-01-09', '1997-01-09'),

 

       (7,  '1997-01-12', '1997-01-15'),

 

       (8,  '1997-01-13', '1997-01-14'),

 

       (9,  '1997-01-14', '1997-01-14'),

 

       (10, '1997-01-17', '1997-01-17');

 

解惑 #1

 

SELECT T1.start_date, MAX(T2.end_date)

  FROM Timesheets AS T1, Timesheets AS T2

 WHERE T1.start_date <= T2.end_date

   AND NOT EXISTS

       (SELECT *

          FROM Timesheets AS T3, Timesheets AS T4

         WHERE T3.end_date < T4.start_date

           AND T3.start_date >= T1.start_date

           AND T3.end_date <= T2.end_date

           AND T4.start_date >= T1.start_date

           AND T4.end_date <= T2.end_date

           AND NOT EXISTS

               (SELECT *

                  FROM Timesheets AS T5

                 WHERE T5.start_date BETWEEN T3.start_date AND T3.end_date

                   AND T5.end_date BETWEEN T4.start_date AND T4.end_date))

 GROUP BY T1.start_date

HAVING T1.start_date = MIN(t2.start_date);
 结果

 

start_date    end date

 

======================

 

1997-01-01  1997-01-05

 

1997-01-06  1997-01-09

 

1997-01-12  1997-01-15

 

1997-01-17  1997-01-17

 

结果

 

start_date    end date

 

======================

 

1997-01-01  1997-01-05

 

1997-01-06  1997-01-09

 

1997-01-12  1997-01-15

 

1997-01-17  1997-01-17

 

解惑 #2

 

这个查询很长,但是检查一下查询时间。

 

SELECT X.start_date, MIN(Y.end_date) AS end_date

  FROM (SELECT T1.start_date

          FROM Timesheets AS T1

               LEFT OUTER JOIN

               Timesheets AS T2

               ON T1.start_date > T2.start_date

                  AND T1.start_date <= T2.end_date

         GROUP BY T1.start_date

        HAVING COUNT(T2.start_date) = 0) AS X(start_date)

       INNER JOIN

       (SELECT T3.end_date

          FROM Timesheets AS T3

               LEFT OUTER JOIN

               Timesheets AS T4

               ON T3.end_date >= T4.start_date

                  AND T3.end_date < T4.end_date

         GROUP BY T3.end_date

        HAVING COUNT(T4.start_date) = 0) AS Y(end_date)

     ON X.start_date <= Y.end_date

  GROUP BY X.start_date;
 结果

 

start_date    end date

 

=======================

 

1997-01-01   1997-01-05

 

1997-01-06   1997-01-09

 

1997-01-12   1997-01-15

 

1997-01-17   1997-01-17

 

结果

 

start_date    end date

 

=======================

 

1997-01-01   1997-01-05

 

1997-01-06   1997-01-09

 

1997-01-12   1997-01-15

 

1997-01-17   1997-01-17

 

解惑 #3

 

SELECT X.start_date, MIN(X.end_date) AS end_date

  FROM (SELECT T1.start_date, T2.end_date

          FROM Timesheets AS T1, Timesheets AS T2, Timesheets AS T3

         WHERE T1.end_date <= T2.end_date

         GROUP BY T1.start_date, T2.end_date

        HAVING MAX (CASE

                    WHEN (T1.start_date > T3.start_date

                         AND T1.start_date <= T3.end_date)

                         OR (T2.end_date >= T3.start_date

                            AND T2.end_date < T3.end_date)

                    THEN 1 ELSE 0 END) = 0) AS X

 GROUP BY X.start_date;

 


结果


start_date    end_date

 

========================

 

1997-01-01   1997-01-05

 

1997-01-06   1997-01-09

 

1997-01-12   1997-01-15

 

1997-01-17   1997-01-17


这个小小的查询中包含了很多逻辑。

分享到:
评论

相关推荐

    SQL语句备忘手册

    SQL语句备忘手册是一本全面涵盖SQL基本到高级操作的手册,对于SQL学习者和开发者来说,这是一份非常实用的参考资料。手册分为多个部分,详细介绍了SQL的各种语句和函数,帮助用户掌握数据库管理和数据操作的核心技能...

    SQL-Injection-cheat-sheet:利用和学习SQL注入的备忘单

    本备忘单是针对SQL注入的学习和利用资源,涵盖了各种注入技巧和防御策略。 1. **SQL注入基本原理**: SQL注入发生时,用户输入的数据未经验证或过滤就直接被用作数据库查询的一部分,导致执行非预期的SQL命令。...

    学习数据库笔记备忘SQL语句复习

    根据提供的标题、描述以及部分文本内容,我们可以总结出以下关于SQL语句的重要知识点: ### SQL基础知识 #### 创建数据库(Create Database) 创建一个新的数据库是管理数据的第一步。在SQL中,可以使用`CREATE ...

    个人备忘录

    【个人备忘录】是一款简易的备忘录应用程序,它提供了基本的记录、保存和查看功能,方便用户在日常生活中管理待办事项、记事或提醒。这款应用的亮点在于其简洁的界面和易于操作的设计,使用户可以快速上手并有效管理...

    KNIME常用节点介绍及备忘.docx

    KNIME 的按条件汇聚节点可以按照指定列为条件对其他列进行汇聚操作,类似于 SQL 中的 GroupBy。 7. 重命名列节点 KNIME 的重命名列节点可以重命名列名,对 GroupBy 后的新列进行重命名或者对数据类型进行调整。 8...

    数据库语句大全,留着备忘啊

    数据库是存储和管理数据的核心工具,SQL(Structured Query Language)是用于操作数据库的语言,包括创建、查询、更新和删除数据等操作。以下是一份全面的SQL知识点概览,旨在帮助你理解和掌握数据库语句的使用。 1...

    SQL的小常识, 备忘之用, 慢慢补充.

    SQL,全称Structured Query Language,是用于管理和处理关系数据库的标准编程语言。在本文中,我们将深入探讨几个关于SQL的小常识,这些知识对于数据库管理和开发人员来说是十分实用的。 首先,`@@ROWCOUNT` 是一个...

    sajib-cheatsheet:这是我的个人备忘单

    【标题解析】:“sajib-cheatsheet”很可能是一个个人创建的备忘单或速查表,由用户“sajib”制作,用于记录和整理各种技术知识点或操作指南。这个标题表明这是一个集中的资源,可能包含编程语言、操作系统命令、...

    适用于新程序员的备忘单:这是针对新程序员和/或我的学生的备忘单。 它由可能想到的问题和为解决这些问题而采取的行动组成

    新程序员备忘单是针对初入编程领域者的实用指南,旨在帮助他们解决在学习和实践过程中可能遇到的各种问题。这份备忘单包含了多种关键知识点,旨在提升编程技能、理解编程概念以及有效地解决问题。 1. **基础语法与...

    java版本控制(数据库版本控制)

    在数据库版本控制中,备忘录模式可以帮助我们记录数据库在不同时间点的结构和数据,使得我们能够回滚到先前的状态,就像在文件系统中使用SVN(Subversion)一样进行版本提交、修改和恢复。 在Java中,实现数据库...

    VFP教程答案

    - **.pjx .pjt**:分别为项目文件和项目备忘录文件的扩展名。 - **Public**:定义全局变量的关键字。 - **Local**:定义局部变量的关键字。 - **Save to mVar all like C***:将所有以C开头的变量保存到mVar变量中。...

    cheatsheets:我编写的各种备忘单上的pdf和屏幕截图的集合

    【标题解析】: "cheatsheets" 这个标题表明这是一个关于备忘单或速查表的资源集合,其中包含了作者自己编写的PDF文档和屏幕截图。这些备忘单通常用于快速查阅各种IT技术或概念的关键信息,帮助用户在实际工作中提高...

    Java面试宝典--牛客网.zip

    2. MyBatis:熟悉SQL映射文件,动态SQL,事务管理等功能。 3. MVC模式:了解Web开发中的Model-View-Controller架构。 以上只是《Java面试宝典--牛客网》中的一部分核心知识点,实际内容可能还包括数据库操作、Web...

    2021-2022计算机二级等级考试试题及答案No.12880.docx

    14. 数据定义查询不属于 SQL 查询,因为 SQL 主要用于数据查询、更新和删除等操作,而数据定义通常涉及创建表、视图等数据库对象,因此 `D.操作查询` 是正确答案。 15. Java 中定义类的关键字是 `class`。 16. ...

    SQLITE资料(SQLite3.0,SQLite语法,SQLite参考手册)

    其次,`SQLite语法备忘录.doc`文档提供了SQLite SQL语言的基本语法规则。SQL是Structured Query Language的缩写,用于创建、查询、更新和管理关系数据库。在SQLite中,你可以学习到如何创建数据库、表,插入、更新和...

    AtCoderChecker

    AtCorderChecker ...存储初始化sql、开发备忘录等。 crawler : 爬虫程序的目录。 用 Ruby 开发。 at-corder-checker :发布在 Web 上的目录。在真实服务器上,在这里放一个符号链接。 使用 PHP、HTML/CSS、JavaS

    CheatSheet

    在这个场景下,"CheatSheet"可能是一个关于对象命令实用程序和"索梅尔"(可能是指Sommelier,一个与数据库管理或数据查询相关的工具,但具体含义未明,因为标签中没有提供更多信息)的备忘单。由于标签为空,我们...

    ASP.NET开发的全能ERP管理系统源码

    功能非常强大,内部已具有缓存机制,以空间换取时间的方式,用户群同时访问可以支持最大限度,还有功能可兼容一切流行浏览器,扩容性强,功能模块:执行模式、办公模式、运营模式、决策 模式、知识中心;待编辑完成后...

Global site tag (gtag.js) - Google Analytics