【MySQL】日付時刻関数を使用して、曜日や週番号を取得する

【MySQL】日付時刻関数を使用して、曜日や週番号を取得する

ハーゲンダッツのクリスピーサンドを2枚重ねで食べてみたいけれど、なかなか勇気がでないfukasawaです。こんにちは。 口いっぱいのクリスプを味わいたいです。

さて、前回はMySQLの日付時刻関数を使用して日付、時刻の差分を取得する方法について書いたのですが、今回は曜日や週番号を扱う方法について調べてみました。

  • 日付から曜日を取得する
  • 指定した日付が、その年の何週目かを取得する

※MySQL 5.6.14で検証しています

日付から曜日を取得する

日付から曜日を取得する関数は、DAYOFWEEK()、WEEKDAY()の2つがあります。
日付式(YYYY-MM-DD)、もしくは日付時刻式(YYYY-MM-DD HH:MM:SS[.fraction])を 引数として渡すことでその日が何曜日か取得します。

#2014-03-10は月曜日
SELECT DAYOFWEEK('2014-03-10');
 -> 2
SELECT WEEKDAY('2014-03-10');
 -> 0

DAYOFWEEK()とWEEKDAY()で戻ってくる値が異なりますが、 それぞれ、以下のような曜日インデックスとして結果を取得しています。

DAYOFWEEK()

1 日曜
2 月曜
7 土曜
※ODBC 標準

WEEKDAY()

0 月曜
1 火曜
6 日曜

どちらの関数も不正な引数を渡した場合はNULLが返ってきます。

指定した日付が、その年の何週目かを取得する

WEEK(date[,mode])

WEEK()関数を使用することで、引数に渡した日付式(YYYY-MM-DD)が その年の何週目なのかを取得することができます

SELECT WEEK('2014-12-01',3);
 -> 49

modeには0~7の数値を渡すことができますが、渡す数値によって「最初の週を"0"として取得するか、"1"として取得するか」「日曜始まりか、月曜始まりか」 「どの週を最初の週として扱うか」といった部分の動作が異なります。

例えば、modeに「3」を渡した場合、「月曜始まり、最初の週を1として取得、1月4日を含む週を第一週として扱う」という動きをします。

SELECT WEEK('2014-01-01',3);
 -> 1

「1月4日を含む週を第一週として扱う」というのが最初よくわからなかったのですが、ISOで定められた週番号の数え方で、 最初の週が4日未満の場合は前年の最終週として扱う考え方らしいです。

modeに渡す数値によって、どのように動作が変わるかは下記サイトのWEEK(date[,mode])の解説部分に表としてまとまっています。

  • MySQL 5.1 リファレンスマニュアル :: 11.5 日付時刻関数
  • mode 引数を省略した場合は、default_week_format サーバ変数で定められたデフォルトモード値が使用されます。

    WEEKOFYEAR(date)

    WEEK(date,3)と同じです。引数で渡した日付の曜日インデックスを1~53で取得します。

    SELECT WEEKOFYEAR('2014-03-10');
     -> 11
    

    YEARWEEK(date[,mode])

    WEEK()では週番号だけを取得しましたが、YEARWEEK()では年も一緒に取得します。

    SELECT YEARWEEK('2014-12-01');
      ->201448
    SELECT YEARWEEK('2014-12-01', 2);
      ->201448
    

    第2引数に渡すmodeはWEEK()と同じです。

    参考 URL

    • このエントリーをはてなブックマークに追加

    この記事を読んだ人にオススメ