« [symfony] HTMLタグを含む文字列をエスケープせずに出力する | トップページ | IE9のshowModalDialogで表示するドキュメント中でElementが未定儀 »

2012.02.02

SQLで月初めの日付を生成(1年分)

月毎の集計表で12か月分の各月の日付が必要で、以下のようなSQLを書いてみた(MySQL用です)。よく知ってる人からすれば当たり前の処理かもしれないけど、自分はすっと出てこないほうで、じっくり考えたから、とりあえずメモ。こういうのは「慣れ」なのかな。

過去に、安易にループしたりして、ソースコード的にも速度的にもえらい事になってるシステムを何度か見たことがある。

/*
 * 当月から過去12か月分の各月1日の
 * 日付を選択(当月含む)
 */
SELECT B.d - INTERVAL N.n MONTH AS d
FROM (
  SELECT DATE(CONCAT(
    YEAR(current_date),'-',
    MONTH(current_date),'-',
    1)) as d) AS B
  JOIN (
    SELECT 0 AS n UNION SELECT 1
    UNION SELECT 2 UNION SELECT 3
    UNION SELECT 4 UNION SELECT 5
    UNION SELECT 6 UNION SELECT 7
    UNION SELECT 8 UNION SELECT 9
    UNION SELECT 10 UNION SELECT 11
  ) AS N
ORDER BY d

0から11までの数列を作る部分はもうちょっとスマートに出来るのかもしれないけれど、ぱっと見てわかりやすいのはこれかなーと。

それから、一旦文字列化して日付に直しているところもスッキリしない。なんか良い手があるなら教えて欲しいです。

以下はこれをモディファイしたもので、年度内の各月を選択(年度が4月始まりの場合)。いつか使うケースがあるかもしれないので、これもメモ

/*
 * 当年度の各月1日の日付を選択
 * (4月始まりの場合)
 */
SELECT (B.d + INTERVAL N.n MONTH) AS d
FROM (
  SELECT DATE(CONCAT(
    YEAR(
      current_date - 
        INTERVAL (4-1) MONTH),'-',
        1,'-',1)) + 
        INTERVAL (4-1) MONTH as d) AS B
  JOIN (
    SELECT 0 AS n UNION SELECT 1
    UNION SELECT 2 UNION SELECT 3
    UNION SELECT 4 UNION SELECT 5
    UNION SELECT 6 UNION SELECT 7
    UNION SELECT 8 UNION SELECT 9
    UNION SELECT 10 UNION SELECT 11
  ) AS N
ORDER BY d

↑この本、面白そう。

« [symfony] HTMLタグを含む文字列をエスケープせずに出力する | トップページ | IE9のshowModalDialogで表示するドキュメント中でElementが未定儀 »

プログラミング」カテゴリの記事

database / SQL / O-R mapping」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: SQLで月初めの日付を生成(1年分):

« [symfony] HTMLタグを含む文字列をエスケープせずに出力する | トップページ | IE9のshowModalDialogで表示するドキュメント中でElementが未定儀 »

2019年5月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
フォト

Google AdSense

銀の弾丸

無料ブログはココログ

他のアカウント