【问题标题】:SQL : built-in way to detect gaps in a arbitrary series of dates?SQL:检测任意日期系列中的间隙的内置方法?
【发布时间】:2012-03-03 05:13:06
【问题描述】:

我有一组输入历史报告的表格。现在生成报告需要一段时间,我想创建缓存表来存储编译后的数据,然后将这些数据输入到报告中。

这些缓存表的一个键是日期字段。我想确保在我使用的任何日期系列中没有任何空白——例如我不想记录 1 月 1 日和 3 日的记录,而 2 日没有行。

我想不出用 RDBMS 中的任何关系工具来强制执行此操作的方法。我可以设置一个日期表,以确保相关记录不会超出一系列日期——如果我的“日期系列”中没有匹配的行,则不允许 1 月 2 日' 表——但我不知道如何自动确保我不会跳过某个范围内的日期。

在数据库架构定义中是否有自动执行此操作的方法?还是我必须检查代码中的空白?

我正在使用 MySQL,但这似乎与 RDBMS 无关。

【问题讨论】:

    标签: sql date sequence gaps-and-islands database-agnostic


    【解决方案1】:

    无法自动执行此操作,但您可以生成日期并将它们存储在临时表中。

    这可以在存储过程中完成:

    • 创建临时表
    • 插入从开始日期到结束日期(每天)的值
    • 选择您的结果并加入临时表
    • 只选择临时表中没有对应的行

    【讨论】:

      【解决方案2】:

      这是一个很好的例子,说明了数字表的用处 (http://www.projectdmx.com/tsql/tblnumbers.aspx)。

      用我不知道的一万行创建您的数字表。然后,您可以从该表中进行选择并使用 DATEADD 函数。

      SELECT DATEADD(d, a.id, '2012-01-01')
      FROM NumbersTable
      

      有了该查询,它就像对您的数据进行良好的 LEFT JOIN 一样简单,您可以查看缺少哪些日期。

      或者,我喜欢做的事情,而不是使用数字表,是创建一个日期表。事实上,您可以在日期表中填充(非节假日)工作日。简单!

      【讨论】:

      • 这样的日期表对于这类事情非常有用。我通常在表格中有几列用于表示工作日、节假日等日期。
      【解决方案3】:

      我不知道有什么内置方法可以做到这一点,但我自己处理的方法是生成一个日期表。我有一个名为tbDates 的静态表,当我需要报告一系列日期并且不想跳过可能缺少数据的日期时,我会这样做:

      select *
      from 
          tbDates d
          left join myTable t
              on d.date = t.date
      

      根据您的日期列在表格中的格式和数据类型,您可能需要对数据进行少量格式化,以便它可以与 tbDates 结合。我的一些应用程序没有 tbDates。在这些情况下,为我想要的范围生成一个具有连续日期的临时表是微不足道的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-03
        • 2016-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多