Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >迭代日期Mysql循环

迭代日期Mysql循环
EN

Stack Overflow用户
提问于 2019-04-20 13:05:56
回答 1查看 2.5K关注 0票数 1

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

#1064 -您的SQL语法有错误;请检查与您的MariaDB服务器版本对应的手册,以获得在第18行附近使用的正确语法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-20 17:10:43

Slightly Altered from a previous solution

您可以使用系统中的任何其他表构建自己的动态日历/列表,这些表至少具有与伪造行号相同的记录。下面的查询将使用MySQL @变量,这些变量的工作方式类似于内联程序和声明。我可以从给定的日期开始.如你的2016-04-20,然后每次迭代通过,增加1周使用日期为基础的功能。不需要我知道或关心有多少天有28,29(闰年),30或31天。

下面的"AnyTableThatHasAtLeast156Records“表引用就是..。数据库中任何至少有156项记录的表格(每年52周,3年)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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个记录的列表(如果您的“任意表…”)一次有156个记录。如果您需要将此连接到其他事务表,则可以通过将上面的连接表设置为join表来实现。这里的好处,因为我包括了开始日期和周末,这些可以成为您加入表的一部分。

例如,on

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

通过在起点上增加一个星期,你可以看到它会做Ex:星期一到星期一。下面的联接条件比EndOfWeek小。这将说明到但不包括截止日期的任何交易.例如2016-04-26 11:59:59下午(因此少于2016-04-27,因为04/27是下周交易周期的开始)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select
      Cal.WeekNum,
      YT.YourColumns
   from
      YourTransactionTable YT
         JOIN ( aboveCalendarQuery ) Cal
            on YT.TransactionDate >= Cal.StartOfWeek
            AND YT.TransactionDate < Cal.EndOfWeek
   where
      whatever else

您甚至可以按照WeekNum这样的方式对group ()执行sum(),如果这是您的意愿的话。

希望这是一种更准确、更有效的方法来构建您的日历以运行并链接到事务(如果您需要的话)。

来自评论的回应。

您可以通过连接到一个(选择1个联合,选择2个联合…)选择156 ),但是你的选择。"AnyTable…“的唯一原因我确信有任何合理的数据库与交易,你会有156条记录,或更容易。它的唯一目的是只允许一行循环遍历迭代,以动态创建行。

也比你一开始遇到的循环机制更健全。这没有什么错,尤其是学习的目的,但如果更有效的方法,这不是更有意义吗?

/评论中的反馈

我不太清楚你想要插入的另一张桌子,但是是的,你可以用它来做所有的3000件事情。提供更多你想做的事我可以调整.在一般的时间里,像这样的.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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个条目。因此,如果您有一个库存项目表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Item  Name
1     Thing1
2     Thing2
3     Thing3

您的最后插入将是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,您将看到查询将插入到目标表中的所有记录。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55777728

复制
相关文章
Android Source Generator错误:无法找到基本名称xxx的包
File > Project Structure > facets > 添加Android-Gradle > 关闭并重新打开项目并重建.
可定
2020/04/20
8470
[1207]ImportError:无法导入名称“ RandomizedLogisticRegression”
ImportError:无法导入名称“ RandomizedLogisticRegression”
周小董
2023/10/10
4240
Netty在Dubbo中的线程名称
在项目中,我们会使用RocketMQ和Dubbo.前者用于发送或消费消息,后者用于两个模块之间的接口调用.
书唐瑞
2022/06/02
1.3K0
Netty在Dubbo中的线程名称
python包urllib名称
经查询,在python3.5版本中是使用urllib.request,而在python2.7中则是urllib2
努力在北京混出人样
2019/02/18
9850
破解在idea中无法加载spring cloud config中多环境配置之谜
1、config 默认Git加载 通过spring.cloud.config.server.git.uri指定配置信息存储的git地址,比如:https://github.com/xxx/config-repo
算法之名
2019/08/20
2.3K0
破解在idea中无法加载spring cloud config中多环境配置之谜
[1207]ImportError:无法导入名称“ RandomizedLogisticRegression”
ImportError:无法导入名称“ RandomizedLogisticRegression”
周小董
2023/10/10
4060
PHP中Redis扩展无法加载问题
phpredis编译出来的redis.so也需要拷贝到"/usr/lib64/php/modules/"中;
叫我可儿呀
2019/11/16
2K0
Idea 中图片资源无法加载问题
今天在看一个 Java 的小游戏时,遇到项目图片资源无法加载的问题,运行显示界面如图
攻城狮杰森
2022/06/03
2.9K0
Idea 中图片资源无法加载问题
springboot测试中主程序中能加载bean测试中无法加载bean
如遇到springboot版本的问题导致bean类无法注入到项目中,可能是注解和springboot版本不匹配导致启动类启动时扫描不到相应的bean类
一个风轻云淡
2022/11/13
1.8K0
springboot测试中主程序中能加载bean测试中无法加载bean
无法在R里面加载相应版本的python
reticulate可以实现R与python的相互切换,即在R里面调用python的脚本、模块等。
生信编程日常
2020/11/24
2.4K0
在Intellij IDEA中修改模板中user变量名称
默认IDEA取的是当前系统的用户名作为这个变量的,但是如果系统的用户名不是你期望的用户名,那么修改系统的用户名在IDEA中也还是使用的是旧的用户名。
前Thoughtworks-杨焱
2021/12/08
3.6K0
java中无法解析为类型_java无法解析导入的包
.odt文件是openoffice软件产生的文档格式,可以直接用office打开,这其实就是一个压缩包,可以使用解压软件打开,里面有一个content.xml文件,这个文件内有<text:p>标签,标签内就是展示出来的内容。
全栈程序员站长
2022/10/28
4.8K0
java:加载jar包中的动态库
java中System.load(String)方法可以加载一个动态库,有时为了便于管理和发行,我们会把动态库打包jar包一起发行。这时如何加载jar包中的动态库呢? 原理也很简单,就是先把动态库解
10km
2019/05/25
3.9K0
Gravatar 头像无法加载
由于众所周知的原因,头像服务器多数都无法正常访问,不管是http还是https。为了解决头像问题有两个办法:
obaby
2023/02/22
1.5K0
制作动态framework与静态framework的那些坑
今天我们来看看制作framework---dynamic和static这两中库需要注意的
大话swift
2020/05/08
2.1K0
制作动态framework与静态framework的那些坑
面试题:unittest加载测试用例名称必须以test开头,是否可以定制化
前几天,在一个群里,一个人问了,这样一个问题。说他面试遇到一个面试官,问他,为啥unittest的测试用例要用test 开头,能不能定制化。他不知道为啥。
雷子
2021/03/15
1.3K0
面试题:unittest加载测试用例名称必须以test开头,是否可以定制化
Excel小技巧58: 在公式中快速应用名称
在Excel中,名称是一个非常好的功能,不仅能够简化公式,而且让公式的可读性更好。本文介绍一个小技巧,可以让定义的名称快速应用到公式中。对于使用单元格引用的公式,这是一个非常好应用名称的方法。
fanjy
2020/09/27
1.1K0
Excel小技巧58: 在公式中快速应用名称
问题idea maven无法加载导入子模块的依赖包的解决
还有个问题,如果使用自己下载的maven版本,会出现无法导入maven工程的错误;提示如下
JQ实验室
2022/06/09
2.8K0
在启动jar包时,发现内存不足无法启动
发现有一command为abrt-hook-ccpp的进程占用较多CPU和内存资源,如上图所示,abrt是AUTOMATIC BUG REPORTING TOOL的缩写。 解决方案 为了解决该问题,可以关闭abrt-hook-ccpp,具体操作如下:
高大北
2022/06/14
2.7K0
在启动jar包时,发现内存不足无法启动
点击加载更多

相似问题

将每个函数应用于列表Haskell的每个元素

24

如何在Haskell中将函数应用于列表中的每个元素?

119

应用于Haskell中嵌套列表的类似函数

12

将函数应用于Haskell中的元素列表

12

如何将高阶函数应用于Haskell中的有效函数?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文