从条件-SQL返回的日期开始生成日期

从条件-SQL返回的日期开始生成日期,sql,date,Sql,Date,我早些时候问过的一个问题。但是,当有where子句生成开始日期时,日期生成似乎停止,只显示第一个间隔日期。我还检查了其他帖子,那些我发现的帖子,显示的是静态日期或使用CTE。。我正在寻找一个没有存储过程/功能的解决方案 这项工作: 这些没有: 预期成果: 与第一个查询结果相同,因为它开始生成stDate为mmid=100的日期 SQL Server/MS Access SQL as和PostGres具有Generate_系列功能,最好使用ANSI SQL,以便MYSQL支持。我想知道这是MYSQ

我早些时候问过的一个问题。但是,当有where子句生成开始日期时,日期生成似乎停止,只显示第一个间隔日期。我还检查了其他帖子,那些我发现的帖子,显示的是静态日期或使用CTE。。我正在寻找一个没有存储过程/功能的解决方案

这项工作:

这些没有:

预期成果:

与第一个查询结果相同,因为它开始生成stDate为mmid=100的日期

SQL Server/MS Access SQL as和PostGres具有Generate_系列功能,最好使用ANSI SQL,以便MYSQL支持。我想知道这是MYSQL中的一个bug还是一个限制


附:我以前也问过类似的问题。它基于静态日期值,而此日期值基于基于条件的表列中的日期值。

确保跨平台兼容性的最简单方法是使用日历表。以最简单的形式

create table calendar (
  cal_date date primary key
);

insert into calendar values
('2013-01-01'),
('2013-01-02'); -- etc.
有许多方法可以生成插入日期

使用WHERE子句来选择行,而不是使用WHERE子句来生成行。要选择今年10月,只需

select cal_date
from calendar
where cal_date between '2013-10-01' and '2013-10-31';
它相当紧凑——365000行,覆盖1000年。这应该涵盖大多数业务场景

如果需要跨平台日期算法,可以添加一个理货列

drop table calendar;
create table calendar (
  cal_date date primary key,
  tally integer not null unique check (tally > 0)
);

insert into calendar values ('2012-01-01', 1); -- etc.
要选择从2012年1月12日开始到日历年结束的30天间隔的所有日期,请使用

select cal_date
from calendar
where ((tally - (select tally
                 from calendar
                 where cal_date = '2012-01-12')) % 30 ) = 0;

cal_date
--
2012-01-12
2012-02-11
2012-03-12
2012-04-11
2012-05-11
2012-06-10
2012-07-10
2012-08-09
2012-09-08
2012-10-08
2012-11-07
2012-12-07

如果您的mmid列保证没有间隙,那么您可以使用mmid列代替我的理货列。谢谢@Catcall。我将更新我的问题,说没有日历表:-即使有日历表,它也不适合这个问题,因为您的示例仍然使用静态范围检索日期。我很想知道为什么查询无法根据条件生成日期,这是一个有效的场景。如果在WHERE子句中使用and mmid=100,将得到一行,该行派生自mmid=100的行。你到底想干什么?显示两个日期之间每隔30天的间隔的日期?我想为每个成员生成10天的间隔,以确定他们的开始日期。30天和10天只是一个例子。你可以在我的表格中看到每个成员的日期。因此,对于10个成员,我需要10个不同的单独日期集,在我的情况下,每个开始日期都是唯一的。如果您需要进一步澄清,请告诉我。我甚至尝试使用通过select into查询设置的变量来分配开始日期。它就是不起作用。@JW。您的SQL技能令人钦佩。你能分享一些关于快速使用SQLFiddle以及快速拍摄Qeries(包括非常简单到高级的Qeries)的技巧吗?你是在几个月后才学会的,还是它是如何达到这个速度的?谢谢
drop table calendar;
create table calendar (
  cal_date date primary key,
  tally integer not null unique check (tally > 0)
);

insert into calendar values ('2012-01-01', 1); -- etc.
select cal_date
from calendar
where ((tally - (select tally
                 from calendar
                 where cal_date = '2012-01-12')) % 30 ) = 0;

cal_date
--
2012-01-12
2012-02-11
2012-03-12
2012-04-11
2012-05-11
2012-06-10
2012-07-10
2012-08-09
2012-09-08
2012-10-08
2012-11-07
2012-12-07