Slightly Altered from a previous solution
您可以使用系统中的任何其他表来构建自己的动态日历/列表,该表至少包含与伪造行号一样多的记录。下面的查询将使用 MySQL @ 变量,其工作方式类似于内联程序和声明。我可以从给定日期开始列表...例如您的 2016-04-20,然后每次迭代,使用基于日期的函数添加 1 周。我无需知道或关心 28、29(闰年)、30 或 31 天有多少天。
“AnyTableThatHasAtLeast156Records”下面的表参考就是这样..您数据库中至少有 156 条记录的任何表(每年 52 周,3 年)
select
YEARWEEK( @startDate ) WeekNum,
@startDate as StartOfWeek,
@startDate := date_add( @startDate, interval 1 week ) EndOfWeek
from
( select @startDate := '2016-04-20') sqlv,
AnyTableThatHasAtLeast156Records
limit
156
这将为您提供 156 条记录的列表(前提是您的“anyTable...”一次有 156 条记录。如果您需要将其连接到其他事务表,您可以通过将上述表设为 JOIN 表来实现。受益于此,由于我包括了开始日期和周末,这些可以成为您加入餐桌的一部分。
例如,关于
record WeekNum StartOfWeek EndOfWeek
1 ?? 2016-04-20 2016-04-27
2 ?? 2016-04-27 2016-05-04
3 ?? 2016-05-04 2016-05-11
4 ?? 2016-04-11 2016-05-18... etc
通过将 1 周添加到起点,您可以看到它会执行 Ex: Monday to Monday。下面的 JOIN 条件比 EndOfWeek 少。这将解释 UP TO 但不包括结束日期的任何交易......例如 2016-04-26 11:59:59PM 的交易(因此少于 2016-04-27,因为 04/27 是下周的交易周期)
select
Cal.WeekNum,
YT.YourColumns
from
YourTransactionTable YT
JOIN ( aboveCalendarQuery ) Cal
on YT.TransactionDate >= Cal.StartOfWeek
AND YT.TransactionDate < Cal.EndOfWeek
where
whatever else
如果这是你想要的,你甚至可以用 group by 比如 by WeekNum 做 sum()。
希望这是一种更准确、更有效的方式来构建您的日历,以便在需要时与交易一起运行并链接到交易。
评论回复。
您可以通过加入 a (select 1 union select 2 union ... select 156),但您可以选择。 “AnyTable…”的唯一原因是我确信任何合理的数据库与事务你将有 156 条记录或更容易。它的唯一目的是只允许一行循环遍历迭代以动态创建行。
也比你一开始遇到的循环机制更健全。这没什么错,尤其是学习目的,但如果有更有效的方法,那不是更有意义吗?
根据评论反馈
我不完全知道您要插入的其他表,但是是的,您可以将它用于所有 3000 件事情。提供更多你想要做的事情,我可以调整......同时,像这样......
insert into YourOtherTable
( someField,
AnotherField,
WeekNum
)
select
x.someField,
x.AnotherField,
z.WeekNum
from
Your3000ThingTable x
JOIN (select
YEARWEEK( @startDate ) WeekNum,
@startDate as StartOfWeek,
@startDate := date_add( @startDate, interval 1 week ) EndOfWeek
from
( select @startDate := '2016-04-20') sqlv,
AnyTableThatHasAtLeast156Records
limit
156 ) z
on 1=1
where
x.SomeCodition...
通过加入对 1=1 的 156 条记录的选择(始终为真),它将为 Your3000ThingTable 中的任何记录返回 156 个条目。因此,如果您有一个带有
的库存项目表
Item Name
1 Thing1
2 Thing2
3 Thing3
您的最终插入将是
Item Name WeekNum
1 Thing1 1
1 Thing1 2
1 Thing1 ...
1 Thing1 156
2 Thing2 1
2 Thing2 2
2 Thing2 ...
2 Thing2 156
3 Thing3 1
3 Thing3 2
3 Thing3 ...
3 Thing3 156
为了预先确认您认为会发生什么,只需尝试 1=1 上的选择/连接,您就会看到查询将插入到目标表中的所有记录。