Mysql 查找缺失的日期范围

2024-01-01

我有一个包含日期范围的表格:

    create table d (
    date_start date,
    date_end date
    );

    insert into d values('2014-03-05', '2014-04-10');
    insert into d values('2014-05-01', '2014-06-05');
    insert into d values('2014-07-10', '2014-08-15');

我想完成此表,但缺少 2014 年的日期范围。在本例中,结果为:

    2014-01-01 - 2014-03-04
    2014-04-11 - 2014-04-30
    2014-06-06 - 2014-07-09
    2014-08-16 - 2014-12-31

有mysql查询建议吗?

Edit

更好地使用这些值:

    create table d (
        date_start date,
        date_end date
        );

        insert into d values('2014-06-01', '2014-06-30');
        insert into d values('2014-07-01', '2014-08-03');
        insert into d values('2014-09-01', '2014-09-30');

Edit 2

我就快到了:

    SELECT
            date_start,
            date_end

    FROM

    (SELECT 
      ends.point AS date_start,
      starts.point AS date_end
    FROM 
      (SELECT 
        d.date_end+INTERVAL 1 DAY AS point, 
        @n:=@n+1 AS num 
      FROM 
        d 
          CROSS JOIN (SELECT @n:=1) AS init0
          ORDER BY date_start
      ) AS ends 
      INNER JOIN 
      (SELECT 
        d.date_start-INTERVAL 1 DAY AS point, 
        @m:=@m+1 AS num 
      FROM 
        d 
          CROSS JOIN (SELECT @m:=0) AS init1
          ORDER BY date_start
      ) AS starts 
      ON ends.num=starts.num
    UNION ALL 
      SELECT 
      '2014-01-01', 
        MIN(date_start) - INTERVAL 1 DAY 
      FROM 
        d 
      WHERE 
        date_start>='2014-01-01'
    UNION ALL 
      SELECT 
        MAX(date_end)+INTERVAL 1 DAY, 
        '2014-12-31'
      FROM
        d 
      WHERE 
        date_end <= '2014-12-31'
    ) as dates
    WHERE
      date_start < date_end
    ORDER BY 
      date_start;

但是,此查询对于以下时间间隔集返回错误结果:

    create table d (date_start date, date_end date);

    insert into d values('2014-01-01', '2014-01-09');
    insert into d values('2014-01-10', '2014-03-15');
    insert into d values('2014-03-16', '2014-04-20');
    insert into d values('2014-05-01', '2014-07-30');
    insert into d values('2014-08-01', '2014-09-30');
    insert into d values('2014-12-25', '2014-12-31');

它似乎无法处理像 2014-07-31 - 2014-07-31 这样的单日。


如果您的日期间隔不会嵌套或相交,您可以使用技巧JOIN产生结果集。因此,要选择所需的记录集,您需要:

SELECT
  *
FROM
(SELECT 
  ends.point AS date_start, 
  starts.point AS date_end 
FROM 
  (SELECT 
    d.date_end+INTERVAL 1 DAY AS point, 
    @n:=@n+1 AS num 
  FROM 
    d 
      CROSS JOIN (SELECT @n:=1) AS init0
  ) AS ends 
  INNER JOIN 
  (SELECT 
    d.date_start-INTERVAL 1 DAY AS point, 
    @m:=@m+1 AS num 
  FROM 
    d 
      CROSS JOIN (SELECT @m:=0) AS init1
  ) AS starts 
  ON ends.num=starts.num 
UNION ALL 
  SELECT 
    '2014-01-01', 
    MIN(date_start) - INTERVAL 1 DAY AS date_end
  FROM 
    d 
  HAVING 
    date_end>'2014-01-01' 
UNION ALL 
  SELECT 
    MAX(date_end)+INTERVAL 1 DAY AS date_start, 
    '2014-12-31' 
  FROM
    d 
  HAVING 
    date_start<'2014-12-31' 
) as dates
WHERE
  date_start<=date_end
ORDER BY 
  date_start;

这将导致



+------------+------------+
| date_start | date_end   |
+------------+------------+
| 2014-01-01 | 2014-03-04 |
| 2014-04-11 | 2014-04-30 |
| 2014-06-06 | 2014-07-09 |
| 2014-08-16 | 2014-12-31 |
+------------+------------+
  

(fiddle http://sqlfiddle.com/#!2/47760/1因为这个就在这里)

要“完成”您的表格,您可以使用INSERT..SELECT http://dev.mysql.com/doc/refman/5.1/en/insert-select.html语法与SELECT上面查询。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mysql 查找缺失的日期范围 的相关文章

  • 获取查询的行号

    我有一个查询将返回一行 当表排序时 有什么方法可以找到我正在查询的行的行索引吗 我试过了rowid但当我期待第 7 行时却得到了 582 Eg CategoryID Name I9GDS720K4 CatA LPQTOR25XR CatB
  • SQL Server PIVOT 函数

    我有一个检索所有代理及其模块的查询 结果集将每个模块返回 1 行 SELECT am agentID AS agentid pa agentDisplayName agentdisplayname m ModuleName ModuleNa
  • 从存储过程中的动态 SQL 获取结果

    我正在编写一个存储过程 需要在过程中动态构造 SQL 语句以引用传入的表名称 我需要让这个 SQL 语句返回一个结果 然后我可以在整个过程的其余部分中使用该结果 我尝试过使用临时表和所有内容 但我不断收到一条消息 提示我需要声明变量等 例如
  • MySQL“选择更新”行为

    根据 MySql 文档 MySql 支持多粒度锁定 MGL case 1 开放航站楼 1 连接到mysql mysql gt start transaction Query OK 0 rows affected 0 00 sec mysql
  • 如何使用实体框架设置连接字符串

    我将 EF6 与 MySQL 结合使用 并有一个用于多个数据库的模型 我希望能够在我的表单中设置连接设置 如何以编程方式设置模型的连接字符串 你应该使用EntityConnectionFactory这就是您所需要的 public strin
  • 数据库字段的标准长度列表

    我正在设计一个数据库表并问自己这个问题 名字字段应该有多长 有人有最常见字段 例如名字 姓氏和电子邮件地址 的合理长度列表吗 我刚刚查询了我的数据库 其中包含美国数百万客户 最大值名长度是 46 我选择 50 当然 其中只有 500 个超过
  • 更新重复密钥上的复合密钥 [重复]

    这个问题在这里已经有答案了 我需要更新新行 如果两者都满足 date dat and empId who 作为复合键 但如果其中之一或两者不同 则插入 sql INSERT INTO history SET endtimestamp now
  • Sql:计算随时间的增长

    我几周前发布了这个问题 但我认为我没有清楚地提出这个问题 因为我得到的答案不是我想要的 我认为最好重新开始 我正在尝试查询数据库以检索一段时间内唯一条目的数量 数据看起来像这样 Day UserID 1 A 1 B 2 B 3 A 4 B
  • SQL Server 使用通配符加入并在第一个匹配处停止

    IF OBJECT ID tempdb TABLE1 IS NOT NULL DROP TABLE TABLE1 IF OBJECT ID tempdb TABLE2 IS NOT NULL DROP TABLE TABLE2 CREATE
  • 本地数据库缓存的最佳实践?

    我正在开发一个应用程序 该应用程序的部分内容依赖于 MySQL 数据库 在某些情况下 应用程序将在互联网连接 UMTS 有限的环境中运行 特别是延迟较高的环境 应用程序的用户能够登录 并且应用程序用户界面的大部分内容都是从 MySQL 数据
  • 数据表 - 服务器端处理 - 数据库列合并

    我目前正在使用 DataTables 1 10 5 服务器端处理功能 http www datatables net examples data sources server side html http www datatables ne
  • 非规范化如何提高数据库性能?

    我听说过很多关于非规范化的内容 它是为了提高某些应用程序的性能而进行的 但我从来没有尝试过做任何相关的事情 所以 我只是好奇 规范化数据库中的哪些地方会使性能变差 或者换句话说 非规范化原则是什么 如果我需要提高性能 如何使用此技术 非规范
  • 消息 102,级别 15,状态 1,第 1 行“ ”附近的语法不正确

    我试图从临时表中查询 但不断收到此消息 Msg 102 Level 15 State 1 Line 1 Incorrect syntax near 有人能告诉我问题是什么吗 是因为要转换吗 查询是 select compid 2 conve
  • 如何通过循环变量在 dbt 中多次运行 SQL 模型?

    我有一个 dbt 模型 测试模型 接受地理变量 zip state region 在配置中 我想通过循环变量来运行模型三次 每次使用不同的变量运行它 问题是 我有一个如下所示的宏 它将变量附加到输出表名称的末尾 即运行测试模型 with z
  • SQL Group BY,每个组的前 N ​​个项目

    我有一个 SQL 查询 可以获取给定商店中销量最高的 5 件商品 SELECT TOP 5 S UPCCode SUM TotalDollarSales FROM Sales S WHERE S StoreId 1 GROUP BY S U
  • 外键引用多个表

    我有4张桌子 A ida name B ida B specific stuff C ida C specific stuff D ida D specific stuff 我希望另一个表 E 可以仅引用 B 或 C 而不是 D 我可以在其
  • 高效插入和更新时检查唯一性

    我的员工表中有 2 列 每列值必须是唯一的 staff code staff name staff id staff code staff name 1 MGT Management 2 IT IT staff 当向表中插入或更新项目时 我
  • 如何在asp.net中按下按钮后刷新Gridview

    我正在尝试制作一个简单的图书馆数据库 我在网格视图中列出搜索结果 然后有一个文本框和一个按钮 用户输入 isbn 并单击贷款按钮 然后 如果有足够数量的物品 itemNumber gt 0 则由用户借出 这是用户界面的屏幕截图 我的问题是
  • 如何使用 PHP 获取列中的所有值?

    我一直在到处寻找这个问题 但仍然找不到解决方案 如何从 mySQL 列中获取所有值并将它们存储在数组中 例如 表名称 客户 列名称 ID 名称 行数 5 我想获取此表中所有 5 个名称的数组 我该如何去做呢 我正在使用 PHP 我试图 SE
  • 让 Prometheus 发送 SQL 查询

    我正在尝试使用普罗米修斯 https prometheus io 监视我的 MySQL 数据库 但似乎找不到添加 SQL 查询的区域 例如 我想运行一个返回值的 SQL 查询 然后将该值添加到图表中 发送警报 有没有办法让 Promethe

随机推荐

  • set_form_data POST 中的转义参数

    这是最奇怪的事情 当我添加 in set form data value被解释为value 在服务器端 当我删除 dontescape 的值被解释为file 3a 2f 2f 2fpath 2fto 到底发生了什么 我不希望任何东西被转义
  • Bender.js:“bender server run”命令打开目录中的bender.js配置文件,而不是启动bender.js服务器

    我是bender js 的新手 我正在尝试运行示例项目 https github com benderjs benderjs example project https github com benderjs benderjs exampl
  • 平衡数组子区间中元素数量的算法?

    假设您有一个包含 4 种不同类型元素的数组 1 1 2 3 1 2 2 3 3 4 4 1 我想找到导致每个元素数量相等且元素总数最大的最长子区间 在这种情况下 它将是 1 1 2 3 1 2 2 3 3 因为这会导致 3 个二 3 个三和
  • 打印机通讯捕获

    如果我需要将其发布到其他地方 请告诉我 我们有一些正在重写的旧软件 它使用专有打印机的打印机驱动程序 我需要重写软件绕过打印驱动程序并直接进入打印机 我确实有打印机通信的规格 这很好 但我想做的是监视与打印机的通信以查看其内容 来自我重写的
  • 迭代强类型泛型 List 的最佳方法是什么?

    在 C NET 和 VB NET 中迭代强类型泛型列表的最佳方法是什么 For C foreach ObjectType objectItem in objectTypeList do some stuff VB NET 的答案来自紫蚂蚁
  • 便携式WAMP包?

    无论如何 我可以在 Windows 7 计算机上的 USB 上使用 PHP mySQL apache phpmyadmin 吗 询问的原因是我没有足够的权限在计算机上安装像 XAMPP 这样的软件包 并且我想测试一些 php 代码文件 谢谢
  • 使用网络摄像头跟踪手势

    我想开发一个程序 使用网络摄像头跟踪四种颜色 并将其放在我双手的食指和拇指上 根据我手的手势 计算机将解释这些手势并执行命令 例如 如果我打开一个网站 我所要做的就是用手指捏一下 网页就会缩放 我希望获得 stackoverflow 社区的
  • 如何根据对象以角度选择表格行?

    大家好 我有一个场景 我真的很困惑如何弄清楚 场景是我有 1 垫料台 即角料台 2 以及一个详细信息视图 根据表中特定行的单击显示详细信息 3 对象列表作为数据源 我在行的单击事件上传递对象 并将对象传递到详细信息视图 并且现在显示该特定行
  • iOS 错误“嵌入式二进制文件未使用与父应用程序相同的证书进行签名”

    这是我在 IOS 应用程序开发中的第一步 我面临着一些我无法解决的问题 error Embedded binary is not signed with the same certificate as the parent app Veri
  • 如何防止元素内的分栏?

    考虑以下 HTML div class x ul li Number one li li Number two li li Number three li li Number four is a bit longer li li Numbe
  • 动态生成n维超立方体m面列表的算法

    我正在尝试设计一种算法 给定n m and vertices where n 超立方体的维数 m 我们尝试生成的面的尺寸 以及vertices is an ordered中的顶点列表n维超立方体 返回表示 m 面的顶点数组的数组n维超立方体
  • Retrofit 在原来的request对象上添加tag

    我正在尝试解决一个问题 我将进行几个异步调用 并根据原始请求执行一项任务 为了解决这个问题 我尝试为每个请求添加一个标签 然后在成功响应后 我可以获取该标签并根据该标签采取操作 在这里 我仅使用 TAG 来识别原始请求 Problem 在调
  • 在 C++ 代码中自动按字母顺序对函数进行排序

    我知道一个C 的类似问题 https stackoverflow com questions 5675636 visual studio 2010 sort functions in the editor alphabetically 我下
  • 将多个版本的 jQuery 与 Require.js 结合使用

    我遇到的情况是 我必须在同一页面上运行两个版本的 jQuery 基本上 有一个网站运行 1 4 2 我有一个运行需要 1 8 2 的脚本的书签我知道这不是一个好主意但我现在坚持下去 现有版本为 1 4 2 合一 所需的新版本为 1 8 2
  • 需要帮助了解如何使用 ajaxify 网站

    我最近发现了关于如何使用 History js jQuery 和 ScrollTo 通过 HTML5 History API Ajaxify 网站的要点 https github com browserstate ajaxify https
  • AJAX - 如何将值传递回服务器

    第一次在 NET 中使用 UpdatePanel 我有一个更新面板 其中的触发器指向 FormView 控件上的事件 UpdatePanel 包含一个ListView 其中包含来自单独数据库的相关数据 当 UpdatePanel 刷新时 它
  • 行断点在某些类中不起作用

    我正在使用 intellij Idea 调试在 tomcat 上运行的应用程序 但我有一个问题 在某些类中 行断点不起作用 方法断点工作正常 但速度很慢 我可以通过从方法断点或另一个类单步进入类来访问特定的代码行或检查变量 但调试器不会在任
  • 如何在 Ubuntu 14.04 上安装 MarkLogic 8?

    在 Ubuntu 14 04 上安装 MarkLogic 8 的步骤是什么 根据 Alex Bleasdale David Ennis 的说法 下载 CentOS 版本 然后 Ubuntu 和其他基于 Debian 的发行版使用 DEB 软
  • Type.GetMethods 的 BindingFlags(不包括属性访问器)

    假设我有以下程序 namespace ReflectionTest public class Example private string field public void MethodOne public void MethodTwo
  • Mysql 查找缺失的日期范围

    我有一个包含日期范围的表格 create table d date start date date end date insert into d values 2014 03 05 2014 04 10 insert into d valu