22

クエリを実行して1年中すべての曜日に参加する必要がありますが、データベースにカレンダーテーブルがありません。
グーグルした後、私generate_series()はPostgreSQLで見つけました。MySQLには似たようなものがありますか?

私の実際のテーブルには次のようなものがあります。

date     qty
1-1-11    3
1-1-11    4
4-1-11    2
6-1-11    5

しかし、私のクエリは次を返す必要があります。

1-1-11    7
2-1-11    0
3-1-11    0
4-1-11    2
and so on ..
4

4 に答える 4

26

これが私のやり方です。2011-01-01から2011-12-31までの日付の範囲を作成します。

select 
    date_format(
        adddate('2011-1-1', @num:=@num+1), 
        '%Y-%m-%d'
    ) date
from 
    any_table,    
    (select @num:=-1) num
limit 
    365

-- use limit 366 for leap years if you're putting this in production

唯一の要件は、any_tableの行数が必要な範囲のサイズ以上である必要があることです(この例では> = 365行)。ほとんどの場合、これをクエリ全体のサブクエリとして使用するため、この場合、any_tableをそのクエリで使用するテーブルの1つにすることができます。

于 2011-07-29T09:38:43.430 に答える
6

@Karolisのソリューションの拡張バージョンで、うるう年を含め、どの年でも確実に機能します。

select date from (
    select
        date_format(
        adddate('2011-1-1', @num:=@num+1),
        '%Y-%m-%d'
    ) date
    from
        any_table,
    (select @num:=-1) num
    limit
        366
) as dt
where year(date)=2011
于 2016-11-02T23:13:56.527 に答える
5

私はこの解決策を探していましたが、「ハードコードされた」日付がなく、今年有効なこの解決策を思いつきました(この回答から助けられました)。注意してください

where year(date)=2011

selectはすでに日付をフィルタリングしているため、必要ありません。また、この方法では、実行時に日付が「計算」されるため、どのテーブルが使用されているか(少なくともテーブルに少なくとも366行が含まれる前に述べられているように)は関係ありません。

 select date from (
    select
        date_format(
        adddate(MAKEDATE(year(now()),1), @num:=@num+1),
        '%Y-%m-%d'
    ) date
    from
        your_table,
    (select @num:=-1) num
    limit
        366 ) as dt
于 2017-07-13T10:18:13.080 に答える
0

誰かがMySQLの一時テーブルとして一連の日付またはintを生成するためのgenerate_series()を探している場合に備えて。

MySQL8(MySQLバージョン8.0.27)を使用すると、次のようなシミュレーションを実行できます。

WITH RECURSIVE nrows(date) AS (
SELECT MAKEDATE(2021,333) UNION ALL 
SELECT DATE_ADD(date,INTERVAL 1 day) FROM nrows WHERE  date<=CURRENT_DATE
)
SELECT date FROM nrows;

結果:

2021-11-29
2021-11-30
2021-12-01
2021-12-02
2021-12-03
2021-12-04
2021-12-05
2021-12-06
于 2021-12-05T06:26:02.550 に答える