MySQLに関する質問です。(最大値の求め方)


id, date, hour というフィールドがあります。idはauto incrementで、主要キーです。dateは2007-05-01という形式で、hourは、毎日の勉強時間が入力されているとします。

このテーブルには、昔からの長期間のデータがあるのですが、最新の年月の月(今なら2007年5月)のうちの、最長勉強時間を抽出するにはどうしたらいいのでしょうか。

最新の年月の月のため、今日であれば、5月1日、2日、3日、4日、5日までのデータしかありません。もし計算する日が4月30日であれば、4月1日から30日までのデータが対象になります。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/05/05 21:56:46
  • 終了:2007/05/06 17:18:50

ベストアンサー

id:Mook No.3

Mook回答回数1312ベストアンサー獲得回数3912007/05/06 12:54:08

ポイント26pt

date が日付型か文字列型かで処理が変わるかと思ったのですが、MySQL の date_format 関数はデータが文字列であっても、日付情報として処理してくれるようです。なので、この関数を使用する範囲では(たとえ文字列型でも)データの格納形式を気にしなくてもよさそうです。

確認のために、varchar 型で date を作成しデータを'2007/05/06' のように格納しても下記のSQL で正しい結果がでました(Ver 5.0.22)。


okuryu さんと russian-blue さんのいいとこ取りですが、

SELECT MAX( hour ) FROM studyTable WHERE
    DATE_FORMAT( NOW(), "%Y-%m") = DATE_FORMAT( date, "%Y-%m") 

で、今月の最大時間が表示されると思います。


MySQL 編16 - 日付関数、システム日付、切捨、日付差、日付加算、書式


蛇足ですが、

hour・・・時間を求める関数

date・・・日付型

として予約語になっていますので、テーブル内のカラム名としては使用しないほうが混乱しないと思います。

id:sun-chan

ありがとうございます!早速やってみます。


また、下のアドバイスもありがとうございます。

2007/05/06 14:35:35

その他の回答(2件)

id:okuryu No.1

okuryu回答回数72ベストアンサー獲得回数32007/05/06 01:02:04

ポイント27pt
SELECT
  MAX(hour)
FROM
  table_name
WHERE
  DATE_FORMAT(date, '%Y-%m' ) = '2007-05'

MAX 関数と DATE_FORMAT 関数を使って例えば2007年の5月の最大値を求めるならこんな感じでどうでしょうか。

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 3.6.2 特定のカラムの最大値が格納されているレコード

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.3.4 日付と時刻関数

id:sun-chan

where節の中で date_format が使えるんですね。

便利ー。



ありがとうございます。うまくいくかやってみます。

2007/05/06 07:17:34
id:russian-blue No.2

russian-blue回答回数36ベストアンサー獲得回数02007/05/06 01:18:58

ポイント27pt

検索条件が特定の年・月の一番勉強した

時間を求める場合はテーブル名がbenkyou

の場合 2007年5月のデータを検索するには

select ifnull(max(hour),0) as hour

from benkyou

where month(date)=5 and year(date)=2007

(勉強していない場合0時間を返す)

時間、日付も抽出したい場合は

(時間が一番長い日が複数ある場合、最初の日

を返す)

select hour,date from benkyou

where month(date)=5 and year(date)=2007

order by hour desc,date asc

limit 1

自動的に今月のデータを抽出する場合は

where month(date)=5 and year(date)=2007

の部分を

where month(date)=month(now())

and year(date)=year(now())

http://q.hatena.ne.jp/answer

id:sun-chan

date の欄は、2007-05-06 の形で格納されていますが、その場合でも


where month(date)=month(now()) and year(date)=year(now())


は、可能なんでしょうか?


とりあえず今日の昼間にでもテストデータを作ってやってみます。

2007/05/06 07:16:56
id:Mook No.3

Mook回答回数1312ベストアンサー獲得回数3912007/05/06 12:54:08ここでベストアンサー

ポイント26pt

date が日付型か文字列型かで処理が変わるかと思ったのですが、MySQL の date_format 関数はデータが文字列であっても、日付情報として処理してくれるようです。なので、この関数を使用する範囲では(たとえ文字列型でも)データの格納形式を気にしなくてもよさそうです。

確認のために、varchar 型で date を作成しデータを'2007/05/06' のように格納しても下記のSQL で正しい結果がでました(Ver 5.0.22)。


okuryu さんと russian-blue さんのいいとこ取りですが、

SELECT MAX( hour ) FROM studyTable WHERE
    DATE_FORMAT( NOW(), "%Y-%m") = DATE_FORMAT( date, "%Y-%m") 

で、今月の最大時間が表示されると思います。


MySQL 編16 - 日付関数、システム日付、切捨、日付差、日付加算、書式


蛇足ですが、

hour・・・時間を求める関数

date・・・日付型

として予約語になっていますので、テーブル内のカラム名としては使用しないほうが混乱しないと思います。

id:sun-chan

ありがとうございます!早速やってみます。


また、下のアドバイスもありがとうございます。

2007/05/06 14:35:35

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません