過去 30 日間のイベントを探しています

もう 1 つの一般的なタスクは、特定の日付範囲に属する行を検索することです。原則として、範囲の開始日と終了日が固定されていれば、これは難しくありません。SQL は数値だけでなく日付も比較できます。

比較演算子は、 <><=などの日付に適用できます。さらに、日付にも使用できる特別な BETWEEN 演算子もあります。たとえば、2022 年の夏に実行する必要があるすべてのタスクをタスク テーブルから選択するクエリを作成してみましょう。リクエストは次のようになります。

SELECT * FROM task  
WHERE task.deadline BETWEEN '2022-06-01' AND '2022-08-31'

このクエリの結果は次のようになります。

ID 従業員ID 名前 締め切り
1 1 フロントエンドのバグを修正 2022-06-01
2 2 バックエンドのバグを修正 2022-06-15
3 5 コーヒーを買う 2022-07-01
4 5 コーヒーを買う 2022-08-01

ただし、たとえば過去 30 日間のタスクを取得したい場合は、リクエストに何を書けばよいでしょうか。過去 30 日間はクエリの実行時間に直接関係します。つまり、クエリが 7 月 25 日に実行される場合は、6 月 25 日から 7 月 24 日までの日付を選択する必要があります。日付範囲を現在時刻にバインドするにはどうすればよいですか?

これを行うには、日付追加関数を使用します。

DATE_ADD (date, INTERVAL expression units)

いくつかの例を挙げて説明するとわかりやすいと思います。

# リクエスト 結果
1 DATE_ADD('2022-06-04'、間隔 5 日) 2022-06-09
2 DATE_ADD('2022-06-04'、間隔 4 週間) 2022-07-02
3 DATE_ADD('2022-06-04'、間隔 2 か月) 2022-08-04
4
5 DATE_SUB('2022-06-04'、間隔 5 日) 2022-05-30
6 DATE_SUB('2022-06-04'、間隔 4 週間) 2022-05-07
7 DATE_SUB('2022-06-04'、間隔 2 か月) 2022-04-04

ちなみに、特定の日付から特定の日、週、月、年を引くこともできます。

そして、リクエストに戻ると、過去 30 日間のデータを取得するには、この範囲内の 2 つの日付が必要になります。

  • CURDATE() - 範囲の終わり
  • DATE_SUB( CURDATE() , INTERVAL 30 DAY) - 範囲の開始

リクエストは次のようになります。

SELECT * FROM task WHERE task.deadline  
BETWEEN DATE_SUB( CURDATE() , INTERVAL 30 DAY) AND CURDATE() 

このクエリの結果は次のようになります (今日は 2022 年 6 月 4 日です)。

ID 従業員ID 名前 締め切り
1 1 フロントエンドのバグを修正 2022-06-01

2 つの日付の差を見つける方法

そしてもう一つ便利な機能があります。場合によっては、2 つの日付の差を日数で計算する必要がある場合があります。これを行うために、SQL には特別な関数 DATEDIFF () があります。

彼女と一緒に仕事をするのはとても簡単です。

DATEDIFF (date 1, date 2)

2 番目の日付は最初の日付から単純に減算されます。date2 が date1 の後に来る場合、結果は負になります。

ちなみに、DATEDIFF() 関数を使用して前のクエリを書き直すことができます。タスク テーブルから、期限が現在の日付と 30 日以内の差があるすべてのタスクを選択する必要があります。そのリクエストは次のようになります。

SELECT * FROM task WHERE DATEDIFF(task.deadline, CURDATE() ) < 30

このクエリの結果は次のようになります (今日は 2022 年 6 月 4 日です)。

ID 従業員ID 名前 締め切り
1 1 フロントエンドのバグを修正 2022-06-01
2 2 バックエンドのバグを修正 2022-06-15
3 5 コーヒーを買う 2022-07-01

今回、SQL は最大 3 行を検出しました。前回は線が 1 つだったのに、今回は 3 つになった理由を考えてください。