golang遍历mysql树_遍历日期Mysql循环

我写了一个存储过程,三年来每周迭代一次。但它不起作用,并返回一个模糊的错误消息。

#1064-您的SQL语法有错误;请查看与MariaDB服务器版本相对应的手册,以获取在第18行“”附近使用的正确语法DELIMITER $$

CREATE PROCEDURE loop_three_years()

BEGIN

declare y INT default 2016;

declare m int default 4;

declare d int default 20;

WHILE y <= 2019 DO

WHILE YEARWEEK(concat(y, '-', m, '-', d)) <= 53 DO

WHILE m < 12 DO

WHILE (m = 2 and d <= 29) OR (d <=30 and m in(4, 6,9,11)) OR ( m in(1,3,5,7,8,10,12) AND d <= 31) DO

set d = d + 7;

SELECT YEARWEEK(concat(y, '-', m, '-', d));

END WHILE;

set d=1;

END WHILE;

set m = 1;

SET y = y + 1;

END WHILE;

END

$$

当我使用这个作为最小的部分时,它们工作,所以我不确定我的重新组装有什么问题。也不确定是否有更好的方法。(select仅用于测试,当我使用真正的代码时,它将是一个insert。

最佳答案:

Slightly Altered from a previous solution

您可以使用系统中的任何其他表来构建自己的动态日历/列表,该表至少包含所需数量的记录来伪造行号。下面的查询将使用MySQL@variables,其工作方式类似于内联程序和声明。我可以从一个给定的日期开始列表。。。例如2016-04-20,然后每次迭代,使用基于日期的函数添加1周。我不需要知道或关心有多少天有28天,29天(闰年),30天或31天。

下面“anytablethasastleast156records”的表引用就是。。数据库中至少有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条记录。如果您需要将此连接到其他事务表,可以通过将上述连接表设置为一个连接表来完成此操作。受益于此,因为我包括开始日期和周末,这些可以成为您加入表的一部分。

示例,打开

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

通过在起点上加上一周,你可以看到它将在星期一到星期一之间完成。下面的连接条件我有小于EndOfWeek的。这将说明任何交易,但不包括结束日期。。。例如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()操作。

希望这是一个更准确和更有效的方式来构建你的日历运行和链接到交易,如果你需要的话。

评论回复。

你可以加入一个(选择1联合选择2联合…选择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上尝试select/join,您将看到查询将插入到目标表中的所有记录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值