勉強したことのメモ

webプログラマが勉強したことのメモ。

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, データベース

  関連記事

MySQLの値について

既存プログラムの解析をしてて知ったこと。 MySQLの構造で「int(11)」と ...

MySQLのエラーログ取得関数

場合によってログに出力させたい値が異なる場合があったのでメモ。 function ...

MySQLでIPアドレスを数値として入れると変になる

MySQLでIPアドレスをINET_ATON関数を用いてINT型に変換し格納する ...

MySQLでユニークキーをはる

MySQLでseqとcodeみたいなものをあわせて ユニークキーをはりたかった。 ...

WordPressで「データベース接続確立のエラー」

WordPressで設定ファイル(wp-config.php)は触っていないのに ...

phpMyAdminやAdminer上だけ文字化け

レンタルサーバーのプログラムでWebページ上では文字化けしていないのに、phpM ...

プリペアドステートメント

個人的に得た内容として、SQL文だけ先にDBに送って、 変数は後で送る。だからS ...

MySQLで経度緯度から半径○Kmのデータを抽出

経度と緯度をtext型として格納しているMySQLのテーブルがあり、指定した経度 ...

WordPressサイトのロードアベレージが高い

あるWordPressサイトのロードアベレージが先月ぐらいまでは通常0.5前後で ...

SSH接続でMySQLにデータをインポートする

phpMyAdminが入っていなかったり、SQLファイルが大きかったりという理由 ...