0

series of dates指定されたintervalvariablestatic dateaは、以前に尋ねたリンクされた質問に従ってaと aを使用して生成できます。ただしwhere、開始日を生成する句がある場合dates generation、停止しているように見え、最初の間隔の日付のみが表示されます。また、他の投稿もチェックしました。たとえば、 1たとえば 2たとえば 3static dateなどの投稿は、 CTE または 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ば、MYSQL, SQL Server/MS Access SQLas Oraclehastruncでサポートされ、rownumこのクエリごとに 14 票で与えられ、関数をPostGres持っていることができgeneratge_Seriesます。これがバグなのか、それとも の制限なのかを知りたいですか?MYSQL


PS: 以前にも同様の質問をしたことがあります。これはstatic date values、条件に基づくテーブル列の日付値に基づいているため、どこに基づいていました。

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

それは適度にコンパクトです-1000年の期間をカバーするために365,000行。これは、ほとんどのビジネスシナリオをカバーするはずです。

クロスプラットフォームの日付演算が必要な場合は、集計列を追加できます。

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」列にギャップがないことが保証されている場合(カレンダーテーブルの暗黙の要件)、「tally」列の代わりに「mmid」列を使用できます。

于 2013-01-06T23:43:02.047 に答える