日付によるクエリ
MySQLの日付と時刻に関するこのシリーズのこの最後の記事では、SELECTクエリを記述してデータに対する日付関連の洞察を取得することにより、これまでに学んだことを全て実践します。
Datetime列からの日付の選択
データベースを学ぶ人が日付を使用してクエリを実行しようとする時に最初に直面する課題の1つは、大量の時間データがDateTimeおよびTimestampデータタイプとして保存されることです。例えば、Sakilaサンプルデータベースは、顧客テーブルのcreate_date列をDatetimeとして格納します。
したがって、特定の日付に作成された顧客レコードを選択しようとすると、単純に日付値を指定することはできません。
簡単な回避策の1つは、DATE()関数を使用してDatetimeの値をDateに変換することです。
これで、日付が私たちの日付と一致する全てのレコードが返されます。
2つの日付の差を取得する
何かが起こったのはどれくらい前かを判断するクエリを実行することは非常に一般的です。MySQLでは、これを行う方法はDATEDIFF()関数を使用することです。これは2つの日付値を受け入れ、それらの間の日数を返します。Navicat for MySQL 16を使用した簡単な例を次に示します。
上記の例では、DATEDIFF()は、最初の日付が2番目の日付より10日遅いことを示していることに注意してください。最初の引数に以前の日付を使用することもでき、それは負の値を返します。
日以外の期間の計算
日以外の期間については、少し変換する必要があります。例えば、7で割って、2つの日付の間の週数を取得できます。結果に週全体を表示するために、丸めも使用されます。
ROUND(DATEDIFF(end_date, start_date)/7, 0) AS weeksout
他の期間については、TIMESTAMPDIFF()関数が役立つ場合があります。2つのTIMESTAMP値またはDATETIME値(DATE値はMySQLで自動変換されます)と、差の基になる時間の単位を受け入れます。例えば、最初のパラメータで単位としてMONTHを指定できます。
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-04') -- Outputs: 0 SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-05') -- Outputs: 1 SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-15') -- Outputs: 1 SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-12-16') -- Outputs: 7
より複雑な例
DATEDIFF()関数のコツをつかんだら、より高度な方法でそれを使用できます。その好例として、DATEDIFF()関数を使用して、顧客がフィルムのレンタルを返却するまでに保持する平均日数を計算するクエリを次に示します。
それを行うために、DATEDIFF()関数の結果がAVG()関数に渡され、小数点以下1桁に丸められます。
シリーズの結論
日付と時刻についてのこのシリーズでは、次のような多くのことを取り上げました。
- MySQLの5つの時間データタイプ
- いくつかの重要な日付/時刻指向の機能
- MySQLで日付と時刻を作成する方法
- 日付によるクエリ
MySQLで時間データを操作することには確かにもっと多くのことがありますが、このシリーズがMySQL上達への道の良いスタートになることを願っています。