【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 | 土曜 |
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])の解説部分に表としてまとまっています。
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()と同じです。