创建一系列时间段作为行

时间:2010-12-16 21:18:13

标签: mysql date

我想写一个查询,对于过去任何给定的开始日期,每行都有一个为期一周的日期间隔,直到现在。

例如,考虑到2010年11月13日的开始日期和当前日期12-16-2010,我想要一个像

这样的结果集
+------------+------------+
| Start      | End        |
+------------+------------+
| 2010-11-15 | 2010-11-21 |
+------------+------------+
| 2010-11-22 | 2010-11-28 |
+------------+------------+
| 2010-11-29 | 2010-12-05 |
+------------+------------+
| 2010-12-06 | 2010-12-12 |
+------------+------------+

它没有超过12,因为当前日期发生的一周时间尚未完成。

我无法立即开始编写此查询。 我可以在一个查询中执行此操作吗?或者我应该使用代码进行循环,并进行多次查询?

2 个答案:

答案 0 :(得分:2)

在MySQL中动态创建这样的结果集非常困难(但并非不可能),因为它还不支持recursive CTEsCONNECT BYgenerate_series中的任何一个用于在其他数据库中执行此操作。

这是您可以使用的替代方法。

创建并预填充一个表,其中包含从过去某个日期到将来某个日期的所有可能行。然后,您可以通过使用WHERE子句查询此表,使用索引使查询高效,轻松生成所需的结果。

这种方法的缺点非常明显:

  • 不必要地占用存储空间。
  • 如果您在填充表格的范围之外进行查询,则不会得到任何结果,这意味着您必须使用足够的日期填充表格,以便持续应用程序的生命周期,否则您需要脚本可以经常添加更多日期。

另见相关问题:

答案 1 :(得分:0)

请注意这只是一个概念性的想法:我这里没有安装mysql,所以我无法测试它。

但是我会将自己建立在一个包含整数的表格上,以便模拟一个系列。

类似的东西:

CREATE TABLE integers_table
(
  id integer primary key
);

后面跟着(警告,这是伪代码)

  INSERT INTO integers_table(0…32767);

(这应该是我们余生的足够几周: - )

然后

FirstMondayInUnixTimeStamp_Utc= 3600 * 24 * 4
SecondPerday=3600 * 24

(自1970年1月1日起是星期四。小心我没有交叉检查!我可能会关闭几个小时!)

然后

CREATE VIEW weeks
AS 
  SELECT integers_table.id AS week_id,
  FROM_UNIXTIME(FirstMondayInUnixTimeStamp_Utc  + week_id * SecondPerDay * 7) as week_start
  FROM_UNIXTIME(FirstMondayInUnixTimeStamp_Utc + week_id * SecondPerDay * 7 + SecondPerDay * 6) as week_end;