Mysql 将一系列时间段创建为行
我想写一个查询,对于过去任何给定的开始日期,从现在起,每行都有一周的日期间隔 例如,假设开始日期为2010年11月13日,而当前日期为2010年12月16日,我想要一个如下的结果集Mysql 将一系列时间段创建为行,mysql,date,Mysql,Date,我想写一个查询,对于过去任何给定的开始日期,从现在起,每行都有一周的日期间隔 例如,假设开始日期为2010年11月13日,而当前日期为2010年12月16日,我想要一个如下的结果集 +------------+------------+ | Start | End | +------------+------------+ | 2010-11-15 | 2010-11-21 | +------------+------------+ | 2010-11-22 | 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,因为当前日期发生的一周时间不完整
我甚至无法确定如何开始编写这个查询。
我可以在一个查询中完成此操作吗?或者我应该使用代码进行循环,并执行多个查询?在MySQL中动态创建这样一个结果集非常困难(但并非不可能),因为它还不支持其中任何一个,或者我将在其他数据库中使用它
这里有一种可供选择的方法
创建并预填充一个表,其中包含从过去某个日期到将来某个日期的所有可能行。然后,通过使用WHERE子句查询该表,并使用索引使查询高效,可以轻松生成所需的结果
这种方法的缺点非常明显:
- 它不必要地占用了存储空间
- 如果查询超出了填充表的范围,则不会得到任何结果,这意味着您必须在表中填充足够的日期以维持应用程序的生命周期,或者需要脚本每隔一段时间添加更多的日期
CREATE TABLE integers_table
(
id integer primary key
);
后跟(警告,这是伪代码)
(对于我们的余生来说,这几周应该足够了:-)
然后
(因为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;
FirstMondayInUnixTimeStamp_Utc= 3600 * 24 * 4
SecondPerday=3600 * 24
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;