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

MySQLでテーブルの日時(DATETIME)列から重複のない日付を抽出する方法

MySQLのテーブルに保存された日時(DATETIME)型のデータから、重複のない日付だけを取り出したいケースはよくあります。そんなときはDISTINCTキーワードを使うことで、簡単に一意な日付の一覧を取得できます。

この記事では、実際にテーブルを作成しながら、日時列から個別の日付を抽出する手順をわかりやすく解説します。

1. サンプルテーブルの作成

まずは、投稿メッセージを管理するためのテーブルを作成しましょう。次のSQLを実行します。

mysql> create table PostMesssageDemo
    -> (
    -> UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> UserMessage varchar(100),
    -> UserPost datetime
    -> );
Query OK, 0 rows affected (0.60 sec)

このテーブルには、ユーザーID(UserId)、メッセージ内容(UserMessage)、投稿日時(UserPost)の3つのカラムが定義されています。

2. テストデータの挿入

続いて、INSERT文を使っていくつかのレコードを登録します。now()関数やdate_add()関数を使うことで、現在日時やそれに一定期間を加えた日時を簡単に挿入できます。

mysql> insert into PostMesssageDemo(UserMessage,UserPost) values('Software Developer',now());
Query OK, 1 row affected (0.17 sec)
mysql> insert into PostMesssageDemo(UserMessage,UserPost) values('Software Developer',date_add(now(),interval 3 month));
Query OK, 1 row affected (0.16 sec)
mysql> insert into PostMesssageDemo(UserMessage,UserPost) values('Software Developer',now());
Query OK, 1 row affected (0.12 sec)
mysql> insert into PostMesssageDemo(UserMessage,UserPost) values('Software Developer','2019-03-31 17:30:34');
Query OK, 1 row affected (0.10 sec)

3. 登録されたレコードの確認

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from PostMesssageDemo;

実行結果は以下の通りです。

+--------+--------------------+---------------------+
| UserId | UserMessage        | UserPost            |
+--------+--------------------+---------------------+
|      1 | Software Developer | 2019-02-15 18:07:27 |
|      2 | Software Developer | 2019-05-15 18:09:18 |
|      3 | Software Developer | 2019-02-15 18:09:31 |
|      4 | Software Developer | 2019-03-31 17:30:34 |
+--------+--------------------+---------------------+
4 rows in set (0.00 sec)

ご覧のとおり、1件目と3件目は同じ「2019年2月15日」に投稿されています。ここから重複を除いた日付だけを取り出すのが今回の目的です。

4. DISTINCTで重複のない日付を取得する

DATETIME型は時刻情報まで含むため、そのままDISTINCTを使っても同じ日でも時刻が異なるレコードは別々に扱われてしまいます。そこで、year()関数とmonth()関数で年月だけを取り出し、それに対してDISTINCTを適用します。

mysql> select distinct year(UserPost),month(UserPost) from PostMesssageDemo;

実行結果は以下のようになります。

+----------------+-----------------+
| year(UserPost) | month(UserPost) |
+----------------+-----------------+
|           2019 |               2 |
|           2019 |               5 |
|           2019 |               3 |
+----------------+-----------------+
3 rows in set (0.00 sec)

このように、重複していた2019年2月が1行にまとめられ、「2019年2月」「2019年5月」「2019年3月」という3つの一意な年月が取得できました。

まとめ

DATETIME列から重複のない日付を抽出するポイントは以下の2つです。

  • DISTINCTキーワードを使って重複行を排除する
  • year()やmonth()、day()などの関数で必要な単位(年・月・日)に切り出してからDISTINCTを適用する

日単位で抽出したい場合は「date(UserPost)」を使えば、時刻を無視した日付単位の一意なリストも簡単に取得できます。ログ分析や集計処理などでぜひ活用してください。

  1. MySQLでテーブルの重複を除いたレコードから平均値を取得するクエリの書き方

    MySQLで平均値を求めるには AVG() 関数を使用します。さらに DISTINCT と組み合わせることで、重複しているレコードを除外した状態で平均を計算することができます。この記事では、実際にサンプルテーブルを作成しながら、個別(ユニーク)なレコードから平均値を取得する方法を解説します。サンプルテーブルの作成まず、以下のクエリでテーブルを作成します。mysql> create table DemoTable1934 ( StudentName varchar(20), StudentMarks int ); Query OK, 0 rows affec

  2. MySQLで値が「0」の場合に別の列から値を取得する方法

    MySQLで値が「0」の場合に別の列から値を取得する方法MySQLでは、IF()関数を使用することで、特定の列の値が「0」だった場合に、別の列の値を代わりに取得できます。条件分岐を1つのクエリ内で簡単に実現できる便利な関数です。IF()関数の基本構文select IF(yourColumnName1=0,yourColumnName2,yourColumnName1) as anyAliasName from yourTableName;この構文では、最初の列の値が「0」であれば2番目の列の値を返し、「0」以外であれば最初の列の値をそのまま返します。サンプルテーブルの作成まず、動作確認用のテー