演習課題「ユーザーの平均年齢を求める」
右側のコードエリアのSQLは、サンプルデータベースのusersテーブルから、2016年12月1日時点のユーザーの年齢を表示します。これを利用して、AVG関数を使って平均年齢を求めてください。
出力結果には、「平均年齢」を表示します。
コードを実行して、エラーが出なければ、演習課題クリアです!
入力される値
データベースに格納されているデータは、本レッスンのチャプター01を参照してください。
期待する出力値
平均年齢 |
---|
30.2800 |
#06:ユーザーの年齢を計算をしよう
ここでは、ユーザーのプレイ期間を計算したり、生年月日から年齢を計算したりといった、日付に関するデータを計算してみたいと思います。そのために、今回はSQL上で簡単な四則演算を利用してみましょう。
動画中「プレイ期間の算出」をおこなっている箇所について、講座内容に不備がございました。
paizaラーニングユーザーの皆様には大変ご迷惑をおかけしてしまい申し訳ございません。
ここに深くお詫びし、訂正させていただきます。
MySQLでは日付に関する値を柔軟に扱うために、
要求された形式に応じて文字列もしくは数値のどちらかを返却するようになっています。
たとえば、出力や検索クエリとすることを目的に DATE() を呼び出した場合には
'2020-01-01'のような形式の「文字列」が返却されています。
対して、演算を目的として呼び出した場合には 「20200101」という「数値」 が返却されます。
これは2020年の1月1日ではなく、2020万101 という純粋な数値です。
参考: MysQL公式ドキュメント https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html
各関数の説明に「関数が文字列と数値コンテキストのどちらで使用されているのかに応じて、
現在の日付を 'YYYY-MM-DD' または YYYYMMDD 書式の値として返します。」
といった記述がございます。なお書式は関数ごとに異なります。
この仕様によりDATE型同士を直接演算に利用すると次のような問題が起こります。
例: 2020-02-01 と 2020-01-01の差分を求める場合
DATE('2020-02-01') - DATE('2020-01-01') -- => 100 という結果になってしまう
ここでは演算処理として DATE() を呼び出していますので、「20200201 - 20200101」がおこなわれてしまっています。
以上の仕様により、 DATE() 同士を直接比較していたプレイ期間の算出について
1月をまたいでしまう場合に上記と同じように想定外の数値が表示されていることが判明いたしました。
これに対して、MySQLでは日付や時刻同士を計算するための関数がいくつも用意されています。
同TIPS内にございます TIMESTANPDIFF() を用いる方法や、
0年0月0日からの起算日数を数値で返却する TO_DAYS() を用いる方法など
複数手段がございますので詳細はMySQL公式ドキュメントをご確認ください。
以下はTO_DAYS()を用いる例です。 TO_DAYS(MAX(endTime)) - TO_DAYS(MIN(startTime)) + 1 AS プレイ期間,
-- それぞれ0年0月0日からの日数であるため直接比較しても正しく日数差を求められます
動画および講座内容につきましては、ご準備できしだい、新しいものと差し替える予定です。
よろしくお願いいたします。
足し算 「30 + 10」は、「40」
引き算 「30 - 10」は、「20」
掛け算 「30 * 10」は、「300」
割り算 「30 / 10」は、「3」
カッコの中を先に計算 「10 * (2 + 3)」は、「60」
CURRENT_DATE()) AS 現在日時
TIMESTAMPDIFF(YEAR, (誕生日), (現在の日時))
逆引きSQL構文集 - 四則演算を行う
http://www.sql-reference.com/math/operatore.html
【MySQL】日付時刻関数を使用して、日付や時刻の差分を取得する | バシャログ。
http://bashalog.c-brains.jp/14/02/28-150000.php
mysqlで年齢計算 - Qiita
http://qiita.com/kabayama/items/b5775e6904c7a4d627a8
MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.7 日付および時間関数
https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html