MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLのDATEDIFF()関数が返す負の値を無視して絶対値を取得する方法

MySQLのDATEDIFF()関数で返される負の値を無視する方法

ご存じのとおり、MySQLのDATEDIFF()関数は、2つの日付の間の日数差を取得するために使用されます。この関数は「最初の日付 − 2番目の日付」という計算を行うため、引数の順序によっては負の値が返されることも十分にあり得ます。

まず、以下のようなテーブル「differ」を例に考えてみましょう。

mysql> select * from differ;
+------------+-------------+
| OrderDate  | WorkingDate |
+------------+-------------+
| 2017-10-22 | 2017-10-29  |
| 2017-10-25 | 2017-10-30  |
| 2017-10-25 | 2017-11-30  |
+------------+-------------+
3 rows in set (0.00 sec)

このテーブルに対して、OrderDate(注文日)とWorkingDate(作業日)の差をDATEDIFF()関数で求めると、OrderDateの方が過去の日付であるため、結果は次のように負の値になります。

mysql> Select DATEDIFF(OrderDate, WorkingDate) AS 'DIFFERENCE IN DAYS' from differ;
+--------------------+
| DIFFERENCE IN DAYS |
+--------------------+
|                 -7 |
|                 -5 |
|                -36 |
+--------------------+
3 rows in set (0.00 sec)

ABS()関数を使って負の値を無視する

日数差の「大きさ」だけが必要で、符号が不要なケースは多くあります。そんなときは、MySQLのABS()関数を組み合わせることで、負の値を無視して絶対値として取得できます。具体的には、DATEDIFF()関数の結果をABS()関数で囲むだけで実現できます。

mysql> Select ABS(DATEDIFF(OrderDate, WorkingDate)) AS 'DIFFERENCE IN DAYS' from differ;
+--------------------+
| DIFFERENCE IN DAYS |
+--------------------+
|                  7 |
|                  5 |
|                 36 |
+--------------------+
3 rows in set (0.00 sec)

このように、ABS(DATEDIFF(日付1, 日付2))という形式にすることで、どちらの日付が先であっても、常に正の日数差を取得できます。日付の順序を意識せずに純粋な「間隔」を知りたい場合に非常に便利なテクニックです。

  1. MySQLで同じ列の値を持つ行を抽出する方法【GROUP BY活用】

    はじめにMySQLで「同じ列の値を持つ行」を取得したい場合は、GROUP BY句を使用します。本記事では、実際のサンプルを使いながら、特定の複数のIDに対して共通する値を持つ行を抽出する方法をわかりやすく解説します。サンプルテーブルの作成まず、デモ用のテーブルを作成しましょう。mysql> create table DemoTable -> ( -> StudentId int, -> StudentMarks int -> );Query OK, 0 rows affected (4.71 sec)テストデータの挿入insertコマンドを

  2. MySQLのDATEDIFF関数で現在の日付と入社日の差(日数)を求める方法

    MySQLでは、DATEDIFF()関数を使うことで、2つの日付の差を日数で簡単に計算できます。この記事では、まずCURDATE()関数で現在の日付を取得し、その後DATEDIFF()関数を使って入社日(JoiningDate)と現在日付の差を求める手順を解説します。現在の日付を確認する現在の日付はCURDATE()関数で以下のように取得できます。mysql> select curdate(); +------------+ | curdate() | +------------+ | 2019-10-26 | +------------+ 1 row in set (0.00 sec