【问题标题】:Creating a list of month names between two dates in MySQL在 MySQL 中创建两个日期之间的月份名称列表
【发布时间】:2023-03-13 06:03:02
【问题描述】:

如何在两个日期之间创建所有月份名称的列表,例如一月、二月等。例如 2012-02-01 到 2013-03-29 与 MySQL .. 而二月将生成两次,一个用于 2012 年,另一个用于 2013

【问题讨论】:

  • 我需要将这些月份与学生费用联系起来......他们在课程开始和课程结束之间的费用
  • select DISTINCT month(date) from <table> 适合你吗?
  • 我猜你需要创建一个程序...参考这里stackoverflow.com/questions/510012/…..
  • 是的,费用表有一个开始日期和结束日期,但因为费用可以在会话中间更改.. 月份和日期可能没有用
  • 非常感谢您的链接

标签: mysql sequence


【解决方案1】:

我猜这就是你要找的东西:

select MonthName(aDate) from (
  select @maxDate - interval (a.a + (10 * b.a) + (100 * c.a)) month as aDate from
  (select 0 as a union all select 1 union all select 2 union all select 3
   union all select 4 union all select 5 union all select 6 union all
   select 7 union all select 8 union all select 9) a,
  (select 0 as a union all select 1 union all select 2 union all select 3
   union all select 4 union all select 5 union all select 6 union all
   select 7 union all select 8 union all select 9) b,
  (select 0 as a union all select 1 union all select 2 union all select 3
   union all select 4 union all select 5 union all select 6 union all
   select 7 union all select 8 union all select 9) c,
  (select @minDate := '2012-02-01', @maxDate := '2013-03-29') d
) e
where aDate between @minDate and @maxDate

以防万一有人发现这篇文章并发现它有点难以理解,我添加了一个简短的解释:

这是一个动态的(而且有点丑陋)的解决方案,用于创建不需要创建表的日期范围,并且基于以下查询,该查询为大多数应用程序生成足够的记录(10000 条记录):

select aDate from (
  select @maxDate - interval (a.a+(10*b.a)+(100*c.a)+(1000*d.a)) day aDate from
  (select 0 as a union all select 1 union all select 2 union all select 3
   union all select 4 union all select 5 union all select 6 union all
   select 7 union all select 8 union all select 9) a, /*10 day range*/
  (select 0 as a union all select 1 union all select 2 union all select 3
   union all select 4 union all select 5 union all select 6 union all
   select 7 union all select 8 union all select 9) b, /*100 day range*/
  (select 0 as a union all select 1 union all select 2 union all select 3
   union all select 4 union all select 5 union all select 6 union all
   select 7 union all select 8 union all select 9) c, /*1000 day range*/
  (select 0 as a union all select 1 union all select 2 union all select 3
   union all select 4 union all select 5 union all select 6 union all
   select 7 union all select 8 union all select 9) d, /*10000 day range*/
  (select @minDate := '2001-01-01', @maxDate := '2002-02-02') e
) f
where aDate between @minDate and @maxDate

根据日期范围的长度,您可以通过删除表格(d、c、b 和 a 的顺序)和也将它们从上面的公式中删除。设置 @minDate@maxDate 变量将允许您指定要过滤结果之间的日期。

【讨论】:

  • 在第二行你应该用'month'替换'day',而不是你可以删除最后一行'group by Year(...'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多