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

MySQLの関数を使って2つの日付の年・月・日の差分を返す方法

MySQLでは、日付値を引数として受け取り、年・月・日の差分を返す関数を自作することができます。以下の手順で作成してみましょう。

mysql> CREATE FUNCTION date_difference(Date1 DATE, date2 DATE) RETURNS VARCHAR(30)
    -> RETURN CONCAT(
    -> @years := TIMESTAMPDIFF(YEAR, date1, date2),IF (@years = 1, ' year, ', ' years, '),
    -> @months := TIMESTAMPDIFF(MONTH, DATE_ADD(date1, INTERVAL @years YEAR), date2),IF (@months = 1, ' month, ', ' months, '),
    -> @days := TIMESTAMPDIFF(DAY, DATE_ADD(date1, INTERVAL @years * 12 + @months MONTH), date2),IF (@days = 1, ' day', ' days')) ;
    Query OK, 0 rows affected (0.00 sec)

関数の仕組み

この関数は、以下の要素を組み合わせて差分を計算しています。

  • TIMESTAMPDIFF(YEAR, ...):2つの日付間の「年」の差を計算し、ユーザー変数 @years に格納します。
  • TIMESTAMPDIFF(MONTH, ...):開始日に年数を加算した日付と終了日の間の「月」の差を計算し、@months に格納します。
  • TIMESTAMPDIFF(DAY, ...):開始日に「年数×12+月数」を加算した日付と終了日の間の「日」の差を計算し、@days に格納します。
  • IF():差分が1のときは単数形(year など)、それ以外は複数形(years など)を返すことで、自然な英語表記を実現しています。
  • CONCAT():年・月・日の各結果を1つの文字列に連結して返します。

関数の実行例

次に、作成した date_difference 関数に日付の値を引数として渡して実行してみます。

mysql> Select date_difference('2015-11-16','2016-12-17') AS Difference;
+------------------------+
| Difference             |
+------------------------+
| 1 year, 1 month, 1 day |
+------------------------+
1 row in set (0.00 sec)

上記の結果セットから、引数として指定した2つの日付(2015年11月16日と2016年12月17日)の差が「1年1ヶ月1日」であることが確認できます。このように関数を一度作成しておけば、任意の2つの日付に対して簡単に年・月・日の差分を取得できるようになります。

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

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

  2. MySQLで2つの日時(DATETIME)値の差を求める方法

    MySQLで2つの日時値の差を求める方法MySQLで2つのDATETIME型の値の差を求めるには、TIMESTAMPDIFF()関数を使用します。この関数を使うことで、秒・分・時間などの任意の単位で2つの日時の差を簡単に計算できます。まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable -> ( -> DueDatetime1 datetime, -> DueDatetime2 datetime -> );Query OK, 0 rows affected (0.86 sec)次に、INSE