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

MySQLのEXTRACT()関数に日付値のみを渡して時刻を抽出すると、どのような出力になるのか?

はじめに

MySQLのEXTRACT()関数は、日付や日時の値から特定の部分(年、月、日、時、分、秒など)を取り出すための便利な関数です。しかし、この関数に日付値のみを渡して時刻の情報(時・分・秒)を抽出しようとすると、どのような動作になるのでしょうか。

結論から言うと、MySQLは不正な時刻値として警告(Warning)を発行しつつ、何らかの数値を返します。以下、具体例とともに確認していきましょう。

日付から「時(Hour)」を抽出した場合

日付値「2017-10-20」から時(Hour)を抽出しようとすると、EXTRACT()関数は0を返し、同時に警告が出力されます。

mysql> Select EXTRACT(Hour from '2017-10-20');

+---------------------------------+
| EXTRACT(Hour from '2017-10-20') |
+---------------------------------+
| 0                               |
+---------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> Show Warnings;

+---------+------+----------------------------------------------+
| Level   | Code | Message                                      |
+---------+------+----------------------------------------------+
| Warning | 1292 | Truncated incorrect time value: '2017-10-20' |
+---------+------+----------------------------------------------+
1 row in set (0.00 sec)

警告メッセージ「Truncated incorrect time value(不正な時刻値が切り詰められました)」が示すように、MySQLは日付値を時刻値として解釈できず、切り詰め処理を行っています。

日付から「分(Minute)」を抽出した場合

同じ日付値から分(Minute)を抽出しようとすると、今度は20という値が返されます。この場合も警告が発行されます。

mysql> Select EXTRACT(Minute from '2017-10-20');

+-----------------------------------+
| EXTRACT(Minute from '2017-10-20') |
+-----------------------------------+
| 20                                |
+-----------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> Show Warnings;

+---------+------+----------------------------------------------+
| Level   | Code | Message                                      |
+---------+------+----------------------------------------------+
| Warning | 1292 | Truncated incorrect time value: '2017-10-20' |
+---------+------+----------------------------------------------+
1 row in set (0.00 sec)

このように、抽出対象の単位によって、日付文字列の別の部分が意図せず解釈されてしまう点に注意が必要です。

日付から「秒(Second)」を抽出した場合

秒(Second)を抽出しようとした場合には、17(年の部分の値)が返されます。こちらも同様に警告が表示されます。

mysql> Select Extract(Second from '2017-10-20');

+-----------------------------------+
| Extract(Second from '2017-10-20') |
+-----------------------------------+
| 17                                |
+-----------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> Show Warnings;

+---------+------+----------------------------------------------+
| Level   | Code | Message                                      |
+---------+------+----------------------------------------------+
| Warning | 1292 | Truncated incorrect time value: '2017-10-20' |
+---------+------+----------------------------------------------+
1 row in set (0.00 sec)

CURDATE()を使った場合も同じ結果に

なお、日付リテラルの代わりに現在の日付を返すCURDATE()関数を使って時・分・秒を抽出しようとした場合も、上記と同様の結果(0や警告を伴う予期しない値)となります。

まとめ

EXTRACT()関数で時刻の単位(Hour・Minute・Second)を指定する場合は、必ずDATETIME型やTIME型など、時刻情報を含む値を渡すようにしましょう。日付値のみを渡すと、MySQLは警告(エラーコード1292:不正な時刻値の切り詰め)を発行し、意味のない数値を返してしまいます。意図しないバグを防ぐためにも、引数に渡す値の型には十分注意することが重要です。

  1. MySQLでINSERTと同時に日付・時刻の値を加算して更新する方法

    MySQLのINSERT時に日付や時刻を加算する方法 この記事では、INSERTクエリを実行する際に、datetime型の値をそのまま挿入するのではなく、指定した期間(分・時間・日・月・年)を加算した値を登録する方法を解説します。DATE_ADD関数を使うことで、挿入と同時に日付の計算を行うことができます。 1. テーブルの作成 まず、サンプル用のテーブルを作成します。 mysql> create table DemoTable816 (DueDate datetime); Query OK, 0 rows affected (0.45 sec) 2. DATE_ADD関数を使ったデ

  2. MySQLで日付全体ではなく「日」のみを抽出するクエリの書き方

    MySQLでは、日付型のデータから「年月日」全体ではなく、「日」の部分だけを取り出したいケースがあります。そんなときに便利なのが DAYOFMONTH() 関数です。この記事では、実際にテーブルを作成し、DAYOFMONTH() 関数を使って日付から「日」の値を抽出するまでの手順を、実行例とあわせてわかりやすく解説します。 1. サンプルテーブルを作成する まず、datetime 型のカラムを持つテーブルを作成します。 mysql> create table DemoTable747 (DueDate datetime);Query OK, 0 rows affected (0.53