- ベストアンサー
月に対応するフィールドを抽出するSQL
検索がまずいのか、過去ログに見当たりませんでした。 よろしくお願いします。 以下を実行して、テーブルを作成したとします。 CREATE TABLE table_name (date1 date ,data varchar(20)) データを入力して、 date1 data field1 2004-03-01 AAA field2 2004-03-02 BBB field3 2004-03-03 CCC field4 2004-04-01 DDD これから、3月に対応するフィールドだけを抽出する クエリー文を教えてください。 SELECT * FROM table_name WHERE date1( 以下の文 ) 実際のデータベースでは、月締め計算をしたいのです。 日付は、上記と同じ date 型です。 PHP+MySQLで動かしています。 POSTで実際に受け渡される値は、「2004-3」です。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
即興なので微妙に違っているかもしれませんが、 以下の感じでどうでしょうか? list($Year, $Month) = explode("-", "2004-3"); $Start = date("Y-m-d", mktime(0,0,0,$Month,0,$Year); # 月末を求める $Month++; if($Month > 12){ $Year++; $Month = 1; } $End = date("Y-m-d", mktime(0,0,0,$Month,0,$Year); $Query = "select * from table_name where "; $Query .= "date1 => $Start and date1 =< $End"; mysql_query($Query, $DBHandle);
その他の回答 (4)
- GuruGuru22
- ベストアンサー率51% (177/346)
#3です。 whereの条件に。 $tmp_date1 = '2004-3'; list ($year , $month ) = explode ("-","$tmp_date1"); $sql = "select * from file_name where year(date)=$year and month(date)=$month";
お礼
再びありがとうございます。 初心者にとって、視覚的に非常に理解しやすい記述なので、感心しております。 今動かしているシステムに書き入れました。 うまく動いています。ありがとうございました。
補足
ポイントに関して: 上位の方を評価するのは気が引けますが、ポイント配給が規則になっていますので仕方がありません。 (また今回の解は甲乙つけがたいと思います。) 初心者に対してのアドバイスとしては#1 コーディングの効率という点では#4 美しさということでは、#5と思います。 で、GuruGuru22さんやVargasさんの回答はとてもすばらしいものでしたが、はやくアドバイスをいただけた順で評価を させていただきました。あしからず。 皆様、ありがとうございました。
- Vargas
- ベストアンサー率45% (9/20)
#2です。mysqlでやってみました。 select * from table_name where date_format(date1,'%Y-%c') = '2004-3'; これでいいみたいですね。to_dateは無いみたいですね。 フォーマット文字列もPostgresとは違う様です。 もし、入力月が2桁ならば、'%Y-%m'とすればいいみたいですね。 他にも色々やり方はありそうですよ。下記URL参照。
- 参考URL:
- http://www.mysql.gr.jp/
お礼
とても簡潔な記述で感激です。 カラム名を変数のようにして式に組み込めることを知りませんでした、勉強になります。慣れたら、このような記述が問い合わせにふさわしい表現ですね。
- GuruGuru22
- ベストアンサー率51% (177/346)
MySQL のヴァージョンいくつか知りませんが year と month って関数があります。
お礼
アドバイスありがとうございます。 MySQLは4.0.13、PHPは4.3.2を使用しています。 初心なので、関数があることは知っていますが、 このような場合、どのように利用できるのかよくわかりません。 よろしくお願いします。
- Vargas
- ベストアンサー率45% (9/20)
PHP+MySQL両方とも未経験ですが、Postgresならば、 select * from table_name where date1>=to_date('2004-3','YYYY-MM') and date1<to_date('2004-3','YYYY-MM')+interval '1 month'; で行けます。
お礼
回答ありがとうございます。 まさに、そのような感じで記述して問い合わせを したいと思っています。 同じ書式で書き込みましたが、だめでした。 Postgresと同じ書き方では動かないようです。 これと同じ意味で、MySQLで動く命令は無いものでしょうか。
お礼
目から鱗です、的確なアドバイスありがとうございます。 (目的をきちんと示せなかったので若干記述は異なりますが) 大筋では、ご指摘の方法で完璧に動きます。ほんとにありがとうございました、助かりました。 $tmp_date1 = '2004-3'; list ($year , $month ) = explode ("-","$tmp_date1"); $start = date("Y-m-d", mktime(0,0,0,$month,1,$year)); $end = date("Y-m-d", mktime(0,0,0,$month+1,1,$year)); $sql = "SELECT * FROM file_name WHERE date >= '$start' AND date < '$end' " ; mysql_query.....