我想写一个查询,对于过去任何给定的开始日期,每行都有一个为期一周的日期间隔,直到现在。
例如,考虑到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,因为当前日期发生的一周时间尚未完成。
我无法立即开始编写此查询。 我可以在一个查询中执行此操作吗?或者我应该使用代码进行循环,并进行多次查询?
答案 0 :(得分:2)
在MySQL中动态创建这样的结果集非常困难(但并非不可能),因为它还不支持recursive CTEs,CONNECT BY或generate_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;