none
SQL-Sqrverで月ごとにグルーピングして集計したい RRS feed

  • 質問

  • SQL-Server2005を使用しています。

    YYYY/MM/DDの日付データを年月でグルーピングして、集計をしたいのですが日付をYYYY/MMに

    変更することができません。

    T-SQLを使用せず、SQL文で日付の書式を変更したいのですが、どなたか教えていただけないでしょうか。

    もしくは、他の方法で年月で集計する方法があれば教えていただけないでしょうか。

    【行いたいこと】

    2010/09/30 → 2010/09 とYYYY/MMとしたい。(もしくは201009でも可)

    Oracleなら

    to_char(日付カラム,'YYYY/MM')ですよね。

    SQL-Serverに慣れておらず難航しています。

    どうぞよろしくお願いいたします。

     

     

    2010年9月30日 6:52

回答

  •  CONVERT関数とSUBSTRING関数を組み合わせることで実現できます。
    (@ymdはdatetime型の値が格納されていると考えてください)

    CONVERT関数で日付から文字列に変換(この例では、'yyyy/mm/dd'に変換しています)
     ・CONVERT(varchar(10), @ymd, 111)

    文字列型に変換した値から年・月のみ抜き出す。
     ・SUBSTRING(CONVERT(varchar(10), @ymd, 111), 1, 7)

    CONVERTの引数などはSQL ServerのBooks Onlineを参照してください。
    (CONVERT関数の引数って、日付フォーマットではなく数値パラメータを使うので、今一つわかりにくいんですよね)

    • 回答の候補に設定 山本春海 2010年10月4日 2:33
    • 回答としてマーク 山本春海 2010年10月5日 5:43
    2010年9月30日 7:08

すべての返信

  •  CONVERT関数とSUBSTRING関数を組み合わせることで実現できます。
    (@ymdはdatetime型の値が格納されていると考えてください)

    CONVERT関数で日付から文字列に変換(この例では、'yyyy/mm/dd'に変換しています)
     ・CONVERT(varchar(10), @ymd, 111)

    文字列型に変換した値から年・月のみ抜き出す。
     ・SUBSTRING(CONVERT(varchar(10), @ymd, 111), 1, 7)

    CONVERTの引数などはSQL ServerのBooks Onlineを参照してください。
    (CONVERT関数の引数って、日付フォーマットではなく数値パラメータを使うので、今一つわかりにくいんですよね)

    • 回答の候補に設定 山本春海 2010年10月4日 2:33
    • 回答としてマーク 山本春海 2010年10月5日 5:43
    2010年9月30日 7:08
  • CatTail様

    親切なご回答ありがとうございます。

    できました!

    日付を文字に変換した後に、文字を抜き出すということですね。

     

    2010年10月4日 2:05
  •  はい。その通りです。

     補足ですが、CONVERT関数で日付型をフォーマット付きの文字列型にした理由ですが、単純に文字列にするだけでしたらCAST関数でも可能です。
     ただし多言語対応を考えた場合、ロケーションが日本の場合には問題がなくても日本以外の場合に問題がでます。
     例えば日本の場合、年-月-日の順番ですが、アメリカだと月-日-年になってしまうため、ソートやグルーピングで問題が出てしまいます。

     (SQL Serverに限らず)ロケーションを考えていないアプリケーションが多々ありますので。(蛇足ですが)

    2010年10月5日 4:59
  • こんにちは、junjunju さん。

    MSDN フォーラムのご利用ありがとうございます。フォーラム オペレーターの山本です。

    CatTail さんからの投稿で解決されたようでしたので、私のほうで回答としてマークさせていただきました。
    CatTail さん、アドバイスありがとうございます。

    MSDN フォーラムでは、得られた返信の中の有効な情報には回答としてマークすることをお願いしています。
    回答としてマークすることで、今後同じ問題でこのスレッドを参照される方にも、解決に役立った情報や、参考になった投稿など、有効な情報が分かりやすくなるかと思います。お手数ですが、次回からご協力よろしくお願いしますね。

    今後とも、MSDN フォーラムをよろしくお願いいたします。それでは。
                                                          
    マイクロソフト株式会社 MSDN フォーラム オペレーター 山本 春海

    2010年10月5日 5:43