0

根据我之前提出的链接问题,可以使用 a和 a生成series of dates具有指定的 A。intervalvariablestatic date但是,当有一个where生成开始日期的子句时,dates generation似乎停止并且只显示第一个间隔日期。我还检查了其他帖子,我发现的那些帖子,例如 1例如 2例如 3用 astatic date或使用 CTE 显示。我正在寻找一个没有 storedprocedures/functions...的解决方案

这有效:

SELECT DATE(DATE_ADD('2012-01-12', 
INTERVAL @i:=@i+30 DAY) ) AS dateO
FROM members, (SELECT @i:=0) r
where @i < DATEDIFF(now(), date '2012-01-12') 
;

这些不会:

SELECT DATE_ADD(date '2012-01-12', 
INTERVAL @j:=@j+30 DAY) AS dateO, @j
FROM `members`, (SELECT @j:=0) s
where @j <= DATEDIFF(now(), date '2012-01-12') 
and mmid = 100
;

SELECT DATE_ADD(stdate, 
INTERVAL @k:=@k+30 DAY) AS dateO, @k
FROM `members`, (SELECT @k:=0) t
where @k <= DATEDIFF(now(), stdate)
and mmid = 100
;

预期成绩:

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

最好这样,ANSI SQL它可以按此查询得到支持,并获得 14MYSQL, SQL Server/MS Access SQLOracletrunc具有rownumPostGres功能generatge_Series我想知道这是错误还是限制MYSQL


PS:我之前也问过类似的问题。它是基于static date valueswhere 是基于一个基于条件的表列中的日期值。

4

1 回答 1

0

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

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';

它相当紧凑——365,000 行涵盖 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.

要选择以 30 天为间隔的所有日期,从 2012 年 1 月 12 日开始,到日历年年底结束,请使用

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”列代替我的“tally”列。

于 2013-01-06T23:43:02.047 回答