• 投稿日:2022年02月16日 21時51分07秒
  • 更新日:2022年03月03日 09時32分10秒
ある日を起点に直近〇曜日の日付を取得する

ある日を起点に直近〇曜日の日付を取得する

実行日から直近の木曜日と次の水曜日を取得する

SELECT thuwk_beg + INTERVAL 0 second thu_beg,
thuwk_beg + INTERVAL 604799 second wed_end
FROM (SELECT (DATE(NOW()) - INTERVAL daysbacktothursday DAY) thuwk_beg
FROM (SELECT SUBSTR('3456012',wkndx,1) daysbacktothursday
FROM (SELECT DAYOFWEEK(dt) wkndx FROM (SELECT DATE(NOW()) dt) AAAA) AAA) AA) A;

説明

皆さんご存じの現在日時を取得するSQL

SELECT DATE(NOW()) dt;

そこから曜日番号を取得

SELECT DAYOFWEEK(dt) wkndx FROM (SELECT DATE(NOW()) dt) AAAA;

現在日から何日引けば木曜日になるのかを取得

SELECT SUBSTR('3456012',wkndx,1) daysbacktothursday
FROM (SELECT DAYOFWEEK(dt) wkndx FROM (SELECT DATE(NOW()) dt) AAAA) AAA;

直近の木曜日を取得

SELECT (DATE(NOW()) - INTERVAL daysbacktothursday DAY) thuwk_beg
FROM (SELECT SUBSTR('3456012',wkndx,1) daysbacktothursday
FROM (SELECT DAYOFWEEK(dt) wkndx FROM (SELECT DATE(NOW()) dt) AAAA) AAA) AA;

INTERVAL関数を使い一週間(60 * 60 * 24 * 7 秒)を加算した日を水曜とする

SELECT thuwk_beg + INTERVAL 0 second thu_beg,
thuwk_beg + INTERVAL 604799 second wed_end
FROM (SELECT (DATE(NOW()) - INTERVAL daysbacktothursday DAY) thuwk_beg
FROM (SELECT SUBSTR('3456012',wkndx,1) daysbacktothursday
FROM (SELECT DAYOFWEEK(dt) wkndx FROM (SELECT DATE(NOW()) dt) AAAA) AAA) AA) A;

使い方

NOW()を好きな日にちに入れ替えると起点とする日にちを変えることが出来ます。

またSELECT SUBSTR(‘3456012’,wkndx,1)の’3456012’の並びを変えると開始とする曜日を変えることが出来ます。例えば月曜から日曜だと’6012345’です。
※ここは「今日から何日引くと〇曜日になる」を判定している場所のため、dayofweekで判定し数列の中に’0’が含まれています。
weekdayで判断したい場合は-1しなくてはいけないパターンが出現するのに注意してください。

詳細

最後に

集計をする際に欲しい機能ですね。何ならビューで日付の一覧を作っているともっと楽できます。

ドンピシャな記事があったので紹介もしてますので、是非そちらも参考にして下さい。

最後に

SPECIAL THANKS

  1. 毎週木曜日または他の曜日から始まる週次結果でSQLステートメントを改善するにはどうすればよいですか? -webdevqa.jp.net-
  2. 【MySQL】日付時刻関数を使用して、曜日や週番号を取得する -バシャログ-
Laravel Sailでサクッと環境構築
MySQLでよく使うSQL-ユーザ関係-
MySQLでバックアップとリストア
UbuntuにNginx, MySQL, php をインストールする
Ubuntuに古いphp7.1をインストールする
【MySQL】ユーザに権限を付与する
【MySQL】dumpファイルを指定してインポートする
【Laravel】SQLログを別ファイルに出力