データベース活用をレベルアップ!MySQLで過去の日付を自在に操作するテクニック
MySQLでn日前の日付をタイムスタンプとして取得する方法
方法1:DATE_SUB関数を使う
説明:
DATE_SUB関数は、指定された日付から指定された間隔を引いた新しい日付を返す関数です。この関数を使用して、現在の日付からn日を引いたn日前の日付を取得することができます。
構文:
DATE_SUB(date_expression, INTERVAL expr)
例:
-- 現在の日付から5日前の日付をタイムスタンプとして取得
SELECT DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 5 DAY) AS timestamp_n_days_ago;
出力:
timestamp_n_days_ago
---------------------
2024-06-02 16:37:00
メリット:
- シンプルでわかりやすい構文
- 汎用性が高く、様々な日付操作に使用できる
- INTERVALキーワードが必要
方法2:DATE_ADD関数とCURDATE関数を使う
DATE_ADD関数は、指定された日付に指定された間隔を加えた新しい日付を返す関数です。この関数と現在の日付を取得するCURDATE関数を組み合わせて、n日前の日付をタイムスタンプとして取得することができます。
DATE_ADD(date_expression, INTERVAL expr)
-- 現在の日付から5日前の日付をタイムスタンプとして取得
SELECT DATE_ADD(CURDATE(), INTERVAL -5 DAY) AS timestamp_n_days_ago;
timestamp_n_days_ago
---------------------
2024-06-02 16:37:00
- 2つの関数を組み合わせて使用する必要がある
どちらの方法を選ぶべき?
上記2つの方法は、どちらもn日前の日付をタイムスタンプとして取得することができます。どちらを選ぶべきかは、個人の好みや状況によって異なります。
- シンプルでわかりやすい構文を好む場合は、方法1がおすすめです。
- INTERVALキーワードが必要ない場合は、方法2がおすすめです。
- 上記の例では、n日前の日付をそのまま出力しています。必要な場合は、フォーマットを変更したり、他の処理と組み合わせたりすることができます。
-- 現在の日付から5日前の日付をタイムスタンプとして取得
SELECT DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 5 DAY) AS timestamp_n_days_ago;
-- 現在の日付から5日前の日付をタイムスタンプとして取得
SELECT DATE_ADD(CURDATE(), INTERVAL -5 DAY) AS timestamp_n_days_ago;
timestamp_n_days_ago
---------------------
2024-06-02 16:37:00
説明
- 上記のコードは、
timestamp_n_days_ago
という名前の列にn日前の日付をタイムスタンプとして格納します。 CURRENT_TIMESTAMP()
関数は、現在の日付と時刻を取得します。INTERVAL 5 DAY
は、5日間隔を意味します。DATE_SUB()
関数は、現在の日付から5日間隔を引いたn日前の日付を計算します。CURDATE()
関数は、現在の日付を取得します。
応用例
- 特定の日付からn日前のデータを抽出する
- n日前のデータに基づいて処理を行う
- ログファイルの分析
- n日前の日付を計算する方法は他にもあります。必要に応じて、最適な方法を選択してください。
SELECT STR_TO_DATE(CONCAT(CURDATE(), '-', INTERVAL expr DAY), '%Y-%m-%d') AS timestamp_n_days_ago;
-- 現在の日付から5日前の日付をタイムスタンプとして取得
SELECT STR_TO_DATE(CONCAT(CURDATE(), '-', INTERVAL 5 DAY), '%Y-%m-%d') AS timestamp_n_days_ago;
timestamp_n_days_ago
---------------------
2024-06-02 00:00:00
- 文字列から日付を直接変換できる
- CONCAT関数とSUBDATE関数を組み合わせて使用する必要がある
方法4:CASE WHEN式を使う
CASE WHEN式は、条件に応じて異なる値を返す式です。この式を使用して、現在の日付からn日前の日付を計算し、それをタイムスタンプとして取得することができます。
SELECT CASE
WHEN DAY(CURRENT_TIMESTAMP()) >= expr THEN DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL expr DAY)
ELSE DATE_ADD(CURRENT_TIMESTAMP(), INTERVAL (31 - DAY(CURRENT_TIMESTAMP()) + expr) DAY)
END AS timestamp_n_days_ago;
-- 現在の日付から5日前の日付をタイムスタンプとして取得
SELECT CASE
WHEN DAY(CURRENT_TIMESTAMP()) >= 5 THEN DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 5 DAY)
ELSE DATE_ADD(CURRENT_TIMESTAMP(), INTERVAL (31 - DAY(CURRENT_TIMESTAMP()) + 5) DAY)
END AS timestamp_n_days_ago;
timestamp_n_days_ago
---------------------
2024-06-02 00:00:00
- 複雑な日付計算を簡潔に記述できる
- 読みづらいコードになる可能性がある
上記4つの方法は、それぞれ異なるメリットとデメリットがあります。状況に応じて、最適な方法を選択してください。
- 文字列から日付を直接変換したい場合は、方法3がおすすめです。
- 複雑な日付計算を簡潔に記述したい場合は、方法4がおすすめです。
mysql