• ベストアンサー

月に対応するフィールドを抽出する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」です。

質問者が選んだベストアンサー

  • ベストアンサー
  • sisya
  • ベストアンサー率39% (97/245)
回答No.1

即興なので微妙に違っているかもしれませんが、 以下の感じでどうでしょうか? 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);

rakujin
質問者

お礼

目から鱗です、的確なアドバイスありがとうございます。 (目的をきちんと示せなかったので若干記述は異なりますが) 大筋では、ご指摘の方法で完璧に動きます。ほんとにありがとうございました、助かりました。 $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.....

その他の回答 (4)

回答No.5

#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";

rakujin
質問者

お礼

再びありがとうございます。 初心者にとって、視覚的に非常に理解しやすい記述なので、感心しております。 今動かしているシステムに書き入れました。 うまく動いています。ありがとうございました。

rakujin
質問者

補足

ポイントに関して: 上位の方を評価するのは気が引けますが、ポイント配給が規則になっていますので仕方がありません。 (また今回の解は甲乙つけがたいと思います。) 初心者に対してのアドバイスとしては#1 コーディングの効率という点では#4 美しさということでは、#5と思います。 で、GuruGuru22さんやVargasさんの回答はとてもすばらしいものでしたが、はやくアドバイスをいただけた順で評価を させていただきました。あしからず。 皆様、ありがとうございました。

  • Vargas
  • ベストアンサー率45% (9/20)
回答No.4

#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/
rakujin
質問者

お礼

とても簡潔な記述で感激です。 カラム名を変数のようにして式に組み込めることを知りませんでした、勉強になります。慣れたら、このような記述が問い合わせにふさわしい表現ですね。

回答No.3

MySQL のヴァージョンいくつか知りませんが year と month って関数があります。

参考URL:
http://www.mysql.gr.jp/jpdoc/3.23.x/manual.ja_Reference.html#Date_and_time_functions
rakujin
質問者

お礼

アドバイスありがとうございます。 MySQLは4.0.13、PHPは4.3.2を使用しています。 初心なので、関数があることは知っていますが、 このような場合、どのように利用できるのかよくわかりません。 よろしくお願いします。

  • Vargas
  • ベストアンサー率45% (9/20)
回答No.2

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'; で行けます。

rakujin
質問者

お礼

回答ありがとうございます。 まさに、そのような感じで記述して問い合わせを したいと思っています。 同じ書式で書き込みましたが、だめでした。 Postgresと同じ書き方では動かないようです。 これと同じ意味で、MySQLで動く命令は無いものでしょうか。

関連するQ&A

  • データの加工方法(SQL)について

    「TABLE1」から「TABLE2」というテーブルを作成したいと考えております。 TABLE1ではNAMEという項目がキーとなってデータが入っていました。 それをIDという項目をキーとした形にデータ加工したいと考えています。 各IDにおけるNAMEの数はMAXでも5個までとなります。 何か良い方法は有りますでしょうか? SQLのSELECT文で行う事を考えていますが、方法がわかりませんでした。 (EXCELなどで他に容易な方法があれば他の方法でもかまいません) よろしくお願いいたします。 ■TABLE1 ------------- ID NAME ------------- 1000 AAA 1000 BBB 1000 CCC 1000 DDD 1001 EEE 1001 FFF ------------- ■TABLE2 ---------------------------------------------- ID NAME1 NAME2 NAME3 NAME4 NAME5 ---------------------------------------------- 1000 AAA BBB CCC DDD 1001 EEE FFF ----------------------------------------------

  • SQL文の書き方

    SQL文の書き方を教えて下さい。 以下の2つのクエリー(1のクエリー&2のクエリー)を1つのクエリーで1度に抽出をかけたいのですがSQL文の書き方がわかりません。 データの発生条件としては TableBのField1は必ずTableAのField1に存在するという条件です。 TableAのField1が「AAA」から「EEE」まである場合は、TableBのField1も必ず「AAA」から「EEE」の範囲内で発生します。 よろしくお願い致します。 1のクエリー ---------------------------------------------------------------- TableA Field1 ---------------------------------------------------------------- AAA AAA AAA BBB BBB CCC DDD DDD EEE EEE EEE ---------------------------------------------------------------- Field1をサマライズしてカウントと名称を取得するクエリー Select Count(TableA.Field1) as RecCount, TableA.Field1 From TableA 結果 RecCount  Field1 3      AAA 2      BBB 1      CCC 2      DDD 3      EEE ---------------------------------------------------------------- 2のクエリー ---------------------------------------------------------------- TableB Field1 ---------------------------------------------------------------- BBB CCC CCC EEE ---------------------------------------------------------------- Field1をサマライズしてカウントと名称を取得するクエリー Select Count(TableB.Field1) as RecCount, TableB.Field1 From TableB 結果 RecCount  Field1 1      BBB 2      CCC 1      EEE ---------------------------------------------------------------- 希望する結果 TableAのRecCount TableBのRecCount TableAのField1 3                   AAA 2         1         BBB 1         2         CCC 2                   DDD 3         1         EEE

  • SQL文を教えてください。

    すみません、SQLを教えてください。 ID, 名前の2つのフィールドを持つテーブルがあります。 中身は以下のように入っています。 1, AAA 2. AAA 2, BBB 3, CCC 3, AAA 4, DDD 5, EEE, 5, DDD これを、名前のダブリをスキップしながら、 IDの大きな順番に名前を取り出したいのです。 結果は、以下のようになればいいです。 DDD EEE AAA CCC BBB どのようなSQLを組んだら実現できますか? よろしくお願いいたします。

  • SQLについてお聞きします

    フィールド1 |フィールド2 |フィールド3 AAA |1111 |0000 BBB |1111 |0000 CCC |2222 |2222 CCC |3333 |2222 CCC |4444 |2222 上記のようなテーブルがあった場合、フィールド1のAAAとBBBは値をそのまま抽出し フィールド1のDDDはフィールド2とフィールド3の値が一致しているものを抽出したいのですが ひとつのSQLで実現することは可能でしょうか? フィールド2とフィールド3の値が一致しているものを抽出だけなら簡単にできそうなのですが AAAとBBBもというところで悩んでます。どうかご教授ください。

  • awkで検索し、特定のフィールドを抽出する方法

    UNIX初心者です。 以下のようなデータファイル(AA.dat)から、条件を満たすデータの特定フィールドを別のファイル(BB.dat)に出力したいのです。 どのようにしたら良いのでしょうか? AA.dat(CSV形式) aaa,22,33,44,55,66,77,88,1,1,0,0,1001 bbb,22,33,44,55,66,77,88,1,1,0,0,1002 ccc,22,33,44,55,66,77,88,1,0,0,0,1001 ddd,22,33,44,55,66,77,88,1,1,0,0,1002 抽出条件(フィールド=$1~$13) $9==1 かつ $10==1 かつ $11==0 かつ $12==0 かつ $13==1002 出力するフィールド $1,$2,$4,$7,$8 出力結果 BB.dat(CSV形式) bbb,22,44,77,88 ddd,22,44,77,88

  • SQLについて

    aaa bbb ccc ddd eee ggg hhh ---------------------------------------------- 111 111 111 111 111 111 111 112 112 112 112 112 112 111 112 113 113 113 113 113 111 114 114 114 114 114 114 111 114 114 114 114 114 114 112 114 115 115 114 114 115 111 114 115 115 114 114 115 112 116 116 116 116 116 116 111 116 116 116 116 116 116 112 116 116 116 116 116 117 111 116 116 116 116 116 117 112 118 118 118 118 118 118 118 上記のようなデータより、SQLのSELECTを使用して、以下のように抽出したいです。 抽出条件は以下が全て満たしているものとなります。 ・aaa,ccc,ddd,eee,gggが重複、hhhが小さいもの ・bbbが異なるもの aaa bbb ccc ddd eee ggg hhh ---------------------------------------------- 112 112 112 112 112 112 111 ・・・(1) 112 113 113 113 113 113 111 ・・・(1) 114 114 114 114 114 114 111 ・・・(2) 114 115 114 114 114 115 111 ・・・(2) (1)はaaa,ccc,ddd,eee,gggが重複、bbbが異なるため抽出対象 (2)はaaa,ccc,ddd,eee,gggが重複、bbbが異なるため抽出対象  また、hhhが小さいもの 以上、よろしくお願いします。

  • 同じ列に2行づつで出力するSQL

    次のようなテーブルがあったとき no | name 1 | aaa 3 | bbb 4 | ccc 6 | ddd (先頭はカラム名です) 以下のように出力するSQLは書けますでしょうか? no1| name1 | no2| name2 1 | aaa | 3 | bbb 4 | ccc | 6 | ddd

  • Pro*CでのSQL文について

    こんにちは。 Pro*CでSQLを実行しようとしています。 varchar table_data[200]; (略) EXEC SQL SELECT aaa, bbb, ccc INTO :table_data FROM SAMPLE (略) のようにしてSAMPLEテーブルの列(aaa,bbb,ccc)を変数table_dataに 格納したいと考えています。(もちろん、現在はtable_dataにはaaaの値しか 入っていません(泣)) こういった漢字で変数table_dataに選択列(複数)を取得できるような考えは あるのでしょうか? ちなみにaaa,bbb,cccの区切り文字は考えなくても構いません。 ご多忙でしょうが、どのたかご回答宜しくお願い致します。

  • フィールドをデフォルト0にする

    フィールドをデフォルト0にする方法が知りたいです。 以下のようなサンプルがります。 drop table test_a; create table test_a ( name varchar2(10), a number(1), b number(1), c number(1) ) insert into test_a (name) values ('AAA'); insert into test_a (name,a) values ('BBB', NULL); insert into test_a (name,a,b) values ('CCC', NULL,NULL); select * from test_a; この状態では、a,b,cはNULLですが、a,b,cの値をデフォルト値で0にしたい為、 update test_a set a = 0, b = 0, c = 0; として、データを直して、次回から insert into test_a (name) values ('DDD'); とすると、nameがDDDの時もa,b,cが0となるようにテーブル定義を変えたいのですが 既存のテーブルをそのままで、途中から変更する方法が知りたいです。

  • SQLでできること

    SQLだけでできることと、できないことって、一言で言い表せるでしょうか? データベースからデータを取り出すとき、どこまでできて、どこからはphpなど他の言語で処理したらいいのか、とても気になるんです。 もしかして、何でもできるのかな? というのも、今やりたいと思っていることが、 (環境はMySQL+PHP使用で、ブラウザで表示させます) テーブル A(人物のリスト) id|name ------- 1 | aaa 2 | bbb 3 | ccc 4 | ddd テーブル B(人物と成績のリスト) name| point ------------- aaa | 10 bbb | 15 bbb | 10 aaa | 20 bbb | 25 ccc | 30 のようなテーブルがあったとき、 aaaのpointの合計 = 30 bbbのpointの合計 = 50 cccのpointの合計 = 30 dddのpointの合計 = 0 ← テーブルBに載ってない人もいる という人物全員の結果の集計をするには、どうすると最適でしょう? 私がすぐ思いつくのは、テーブルAのデータを配列に読み込んで、それを元に次はテーブルBから、人物別の行を取り出すSQL文を作って、pointを集計するという手順です。他に手段はあるでしょうか?

    • ベストアンサー
    • MySQL