2

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

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

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

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

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

4

3 回答 3

2

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

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

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

于 2012-02-10T18:32:10.197 回答
1

这是数字表有用性的一个很好的例子 (http://www.projectdmx.com/tsql/tblnumbers.aspx)。

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

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

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

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

于 2012-02-10T18:29:56.450 回答
0

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

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

  • 创建临时表
  • 插入从开始日期到结束日期的值(每天)
  • 选择您的结果并加入临时表
  • 只选择临时表中没有对应的行
于 2012-02-10T18:29:36.790 回答