MySQLでdatetime型データの〇日後を取得する方法(DATEDIFF)
MySQLでdatetime型データがあり、何日経過しているかを取得し、〇日経過していた場合は何らかの処理を行いたい。また〇日部分は固定ではなく変動することがある。具体例としてデータ登録7日後にフラグを変更する、というような処理を行いたい。以下に対応方法をメモ。
DATEDIFF関数を使う
mysql> SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30'); -> 1 mysql> SELECT DATEDIFF('2010-11-30 23:59:59','2010-12-31'); -> -31
注意点として日付部分のみ計算され、時間部分は計算されない。例えば現在「2022-09-25 12:00:00」だったとした場合「2022-09-24 00:00:00」「2022-09-24 23:59:59」どちらも1日後として計算される。厳密に24時間経過したものを1日としてカウントする訳ではない点に注意。その他詳細はリファレンスページを参考。
具体例のソースコード
SELECT *, DATEDIFF( CURRENT_DATE(), regist_date ) AS target_date FROM test_table WHERE DATEDIFF( CURRENT_DATE(), regist_date ) >= 7
上記はregist_dateが7日経過したデータを抽出するSQL文になる。あとはCRONで適宜実行してその後の処理を行う。
所感
今まで〇日後部分は固定というケースのみだったのでデータ登録の際に〇日後の日時を登録しておき、毎日CRONでチェックするような形を取っていた。今回は変動するというケースだったのでPHP・MySQLのどっちで処理すればよいのか迷った。MySQLで簡潔に対応できているので合ってると思いたいところ。
関連記事
-
-
MySQLでデータがあれば上書き、無ければ挿入する
既存のソースを編集時に「REPLACE INTO~~」 という見たことの無いSQ ...
-
-
SortableJSを使ってデータの並べ替え&保存
あるシステムを拝見した際にtableタグ内に並んでいる項目をドラッグ&ド ...
-
-
MySQLで1日の起点を変更する方法
MySQLで1日毎の集計を行う際、例えば2020/01/01のデータは2020/ ...
-
-
MySQLでテーブル構造とデータをコピーする
MySQLで既にあるテーブルとデータに対して実験を行う必要があった。本番テーブル ...
-
-
コマンドでMySQLに郵便番号データを入れる
練習としてコマンドから郵便番号データを入れた際のメモ。 --------- 1: ...
-
-
MySQLに保存したデータをJSON形式で取得する方法
MySQLに保存したデータをJSON形式で利用したいということがたまにある(Ja ...
-
-
MySQLでWhere句を使ってカラム指定でデータコピー
MySQLで大量のデータを保存しているテーブルがあり、そのデータを絞った上で尚且 ...
-
-
MySQLでスレッドの実行状況を表示
データベースサーバが重たく、原因を調査する機会があった。サーバ自体のメモリやCP ...
-
-
MySQLのクエリキャッシュ設定
以前クエリキャッシュを設定していたけど、 これだとmysqlを再起動した時に再度 ...
-
-
MySQLで実行結果の行数取得
DBにデータがあるか調べる際にしばしば使用してたのでメモ。 $sql = " S ...