【问题标题】:SQL - add days to a date in a loopSQL - 在循环中将日期添加到日期
【发布时间】:2017-08-23 15:27:25
【问题描述】:

我有一个包含这些字段的表格:

Id int(11) pk, 
Start_date date, 
End_date date, 
type tinyint(1),
Frequency int. 

我想在此表上进行选择,其中 start_date+frequency = @date(可变日期)直到 end_date(循环)。

如何用 sql 做到这一点?

提前致谢。

编辑: 可变日期是(例如):

SET @date = '2017-03-30'

类型可以是 0 或 1:

  • 如果 type = 0 我的查询是:

     select * from table 
     where type = 0 and start_date <= @date AND end_date>=@date
    
  • 如果 type = 1,频率是一个整数字段(以天为间隔)。所以我必须检查将此值添加到 start_date 是否等于@date。

    • 如果是,我必须返回当前记录
    • 如果没有,我必须迭代这个操作

      Date current = start_date + interval of 'frequency' days
      while(current < end_date){
      if(current == @date)
      (this is the record I want)
      else
      current+=frequency
      }
      

类型1的查询结果可以是多条记录。最后我想在唯一选择中联合类型 0 和 1 的结果。

【问题讨论】:

  • 请提供样本数据和想要的结果。
  • SQL 是一种强大的语言。如果你以正确的方式做事,你几乎不需要循环。一切都应该根据设定来完成。你能解释一下你想达到什么目标吗?
  • @Zack 检查我的编辑,谢谢
  • @PM77-1 检查我的编辑,谢谢
  • 因此,用较少的专注于错误解决方案的术语来说,您想确定start_date@date 之间的差异(以天为单位)是否是frequency的整数倍?

标签: mysql sql phpmyadmin


【解决方案1】:

基于问题下方的评论/确认:

因此,用较少的方式关注错误的解决方案,您想确定start_date@date 之间的差异(以天为单位)是否是@987654323 的整数倍@? ——

看起来你想要类似的东西:

select * from table 
where
   start_date <= @date AND
   end_date>=@date AND
   (
     type = 0 OR
     (
        type = 1 AND
        mod(datediff(@date,start_date),frequency) = 0
     )
   )

一旦我们确定了上面的实际要求,很明显我们只需要找出一个数字是否是另一个数字的倍数,我们使用mod 来计算它。 WHERE 子句的其余结构基本上遵循问题的要点部分。

【讨论】:

  • 如果你能解释一下每一行的作用就好了
猜你喜欢
  • 1970-01-01
  • 2016-03-27
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 2011-10-15
  • 1970-01-01
  • 2012-10-29
相关资源
最近更新 更多