1ヶ月以内に誕生日を迎える社員を表示する

このQ&Aのポイント
  • 1ヶ月以内に誕生日を迎える社員を抽出して表示する方法を教えてください。
  • データベースを作成し、ここ1ヶ月に誕生日を迎える社員を表示したいです。
  • 検索してみたコードではうまく表示されないので、正しい方法を知りたいです。
回答を見る
  • ベストアンサー

1ヶ月以内に誕生日を迎える社員を表示する

これから1ヶ月の間に誕生日を迎える社員を抽出して表示する データベースを作成してここ1ヶ月に誕生日を迎える社員を表示したいです。 12月05日 木村 12月21日 佐々木 01月02日 加藤 上記のように表示したいです。日付が12月6日になったら12月5日生まれの木村は消える。 テーブル名 shop name VARCHAR型 birth DATE型 name | birth ----------------- 田中|1992-11-15 吉田|1990-10-01 佐藤|1885-08-02 検索してみて似たようなものを真似してみたのですが、何も表示されない状態です。 -------------------------------------------------------------------- $stmt = $dbh -> query("SELECT * FROM shop WHERE birth BETWEEN curdate() - interval 1 month + interval 1 day AND curdate()"); while($row = $stmt -> fetch()){ print date('m月d日',strtotime($row['birth'])); print($row['name']); } -------------------------------------------------------------------- これはどのようにしたら抽出して表示できるでしょうか? ご存知の方いらっしゃいましたらご教示ください。 よろしくお願いします。

  • PHP
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.4

失礼。whenを書き漏らしてましたね。 $pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8", "root@localhost", ""); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmd = date('m/d'); $endmd = date('m/d', strtotime('+1month')); $join = $stmd < $endmd ? 'and' : 'or'; $sql = "SELECT shop.*, (case when date_format(birth, '%m/%d') <= ? then 1 else 0 end) as sw FROM shop where date_format(birth, '%m/%d') >= ? " . $join . " date_format(birth, '%m/%d') <= ? order by sw, date_format(birth, '%m/%d')"; try { $sth = $pdo->prepare($sql); $sth->execute(array($stmd, $stmd, $endmd)); while ($row = $sth->fetch(PDO::FETCH_ASSOC)) { print date('m月d日', strtotime($row['birth'])) . '&nbsp;' . $row['name'] . '<br />' . PHP_EOL; } } catch (PDOException $e) { die($e->getMessage()); } (前回との違いは$sqlへ代入する文字列リテラルだけです)

keisuke1258
質問者

お礼

回答ありがとうございます。 先ほど実行してみたら出来ました。 助かりました。ありがとうございます。

その他の回答 (3)

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.3

>ご教示頂いた方法で表示されたのですが、日付がテレコになってしまいます。 >SQL文の最後に「ORDER BY birth」を追加してみましたが何も変わらず。 >どのようにすれば日付順に並べることができるでしょうか? 質問者さんが考えている『日付順』とはどういう並びなんでしょうか?「ORDER BY birth」なら生年月日順になっているハズです。 >ORDER BY date_format(birth, '%m/%d')でソートはできました。 >しかし現時点では下記のように1月が頭にきてしまいます。 >これを防ぐ方法はないでしょうか? 「防ぐ」とは?そう並ぶようにSQL文をかいているのですから、それを防ぐことは出来ませんよ。 取り出してから(php側で配列に格納するなどしてから)好きな順に並び替えて表示してもいい話ではないですかね(そもそも、現状ではphpは無関係でSQLの書き方の話になってます)。 #そもそも最初の質問では order に関しては何も書かれていません。後出しされても困ります。 #こちらも相手がクライアントなら気をつけますが、少なくとも質問者さんは「作る側」ですよね。 もしどうしてもデータベースからの取り出し時に「誕生日が近い順」に取り出したいのであれば $stmd = date('m/d'); $endmd = date('m/d', strtotime('+1month')); $join = $stmd < $endmd ? 'and' : 'or'; $sql = "SELECT shop.*, (case date_format(birth, '%m/%d') <= ? then 1 else 0 end) as sw FROM shop where date_format(birth, '%m/%d') >= ? " . $join . " date_format(birth, '%m/%d') <= ? order by sw, date_format(birth, '%m/%d')"; try { $sth = $pdo->prepare($sql); $sth->execute(array($stmd, $stmd, $endmd)); while ($row = $sth->fetch(PDO::FETCH_ASSOC)) { print date('m月d日', strtotime($row['birth'])) . '&nbsp;' . $row['name'] . '<br />' . PHP_EOL; } } catch (PDOException $e) { die($e->getMessage()); } でいいと思います。 swの値が誕生日が当年なら0, 翌年なら1 になるのはわかりますよね(月日が現在の月日以前で抽出対象になるのは「翌年」のものなので)。$joinを"and"と"or"で使い分けているのが理解出来ていれば自明だとは思いますが・・・

keisuke1258
質問者

補足

回答ありがとうございます。 実行してみましたが、エラー文がでるだけです。 エラー文は下記のようになっています。 SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'then 1 else 0 end) as sw FROM shop where date_format(birth, '%m/%d') >= '12/04' at line 1

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

>1ヶ月以内に誕生日を迎える社員だけ配列に格納できているんですが、 >ここからどうやって「月日」と「名前」を並べられるかが分かりません。 $row['birth']と$row['name']に生年月日と名前が取得できているんですから、それを表示するだけです。 ご自分が最初に書かれたソースにはその部分が含まれていますよ(理解しないでコピペだけしたのでしょうか)。さすがにそこから説明するのは・・・とも思いますし、どういう表示にしたいかは好みの問題です。 while ($row = $sth->fetch(PDO::FETCH_ASSOC)) { print date('m月d日', strtotime($row['birth'])) . '&nbsp;' . $row['name'] . '<br />' . PHP_EOL; }

keisuke1258
質問者

お礼

再度回答ありがとうございます。 ご教示頂いた方法で表示されたのですが、日付がテレコになってしまいます。 SQL文の最後に「ORDER BY birth」を追加してみましたが何も変わらず。 どのようにすれば日付順に並べることができるでしょうか? 何度も申し訳ないですが、よろしくお願いします。

keisuke1258
質問者

補足

ORDER BY date_format(birth, '%m/%d')でソートはできました。 しかし現時点では下記のように1月が頭にきてしまいます。 これを防ぐ方法はないでしょうか? 01月02日 佐々木 12月05日 伊藤 12月15日 佐伯 よろしくお願いします。

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

相互リンク http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12117349417 同じことしか書きませんww 以下、質問者さんにならって私もコピペ ------------------------------------------------------- 少なくとも年月日で保持しているbirthをそのまま使うのは無理だと思いますね。date_formatで月日だけ切り出すべきでしょ $stmd = date('m/d'); $endmd = date('m/d', strtotime('+1month')); if ($stmd < $endmd) { $sql = "SELECT * FROM shop where date_format(birth, '%m/%d') >= '$stmd' and date_format(birth, '%m/%d') <= '$endmd'"; } else { $sql = "SELECT * FROM shop where date_format(birth, '%m/%d') >= '$stmd' or date_format(birth, '%m/%d') <= '$endmd'"; } 少なくとも、こちらで(テストデータを登録して)試した限りでは上記ソースで問題なく抽出されますので・・・ 以下がテストに使ったソース全文です。最終的には同じSQLが生成されるハズです(上記のソースで生成したSQL文をphpMyAdminでSQL実行した結果も確認しています)。 <?php $pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8", "root", ""); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmd = date('m/d'); $endmd = date('m/d', strtotime('+1month')); $join = $stmd < $endmd ? 'and' : 'or'; $sql = "SELECT * FROM shop where date_format(birth, '%m/%d') >= ? " . $join . " date_format(birth, '%m/%d') <= ?"; try { $sth = $pdo->prepare($sql); $sth->execute(array($stmd, $endmd)); while ($row = $sth->fetch(PDO::FETCH_ASSOC)) { print "<pre>"; var_dump($row); print "</pre><hr />"; } } catch (PDOException $e) { die($e->getMessage()); }

keisuke1258
質問者

お礼

回答ありがとうございます。 こちらの方が何度もやり取りできるので良いですね。 実行してみた結果、下記のように配列のコードがずらっと表示されます。 1ヶ月以内に誕生日を迎える社員だけ配列に格納できているんですが、ここからどうやって「月日」と「名前」を並べられるかが分かりません。 array(19) { ["フィールド名"]=> string(2) "値" ・ ・ ・ } array(19){ ["フィールド名"]=> string(2) "値" } ・ ・ ・ よろしくお願いします。 ・

関連するQ&A

  • 直近1ヶ月に誕生日を迎える社員を抽出

    社員の中で直近の1ヶ月に誕生日を迎える社員を抽出し近い日付から順番に表示したいと思っています。 以前ご教示頂いたコードで出来たのですが、少しおかしい点が見つかりました。 現在では下記のように正常に表示されます。 3月2日  山田 3月15日 菊池 3月22日 田中 しかし、実際に山田の誕生日である当日(3月2日)になると、山田のデータは一番下に表示されてしまいます。 3月15日 菊池 3月22日 田中 3月2日  山田 コードは下記のようになっています。 $stmd = date('m/d'); $endmd = date('m/d', strtotime('+1month')); $join = $stmd < $endmd ? 'and' : 'or'; $sql="SELECT office.*, (case when date_format(birth, '%m/%d') <= ? then 1 else 0 end) as sw FROM office where date_format(birth, '%m/%d') >= ? " . $join . " date_format(birth, '%m/%d') <= ? order by sw, date_format(birth, '%m/%d')"; これはどのようにすれば当日になっても順番どおりに表示させることが出来るでしょうか? ご存知の方いらっしゃいましたらご教示ください。 よろしくお願いします。

  • Mysql 誕生日順に並べたい

    社員の生年月日から、今日から、1ヶ月間の誕生日対象者を、誕生日順に出力したいです。 SELECT memname, REPLACE(membirth, "-", "/") as mbirth, REPLACE(RIGHT(membirth, 5), "-", "") as cdate, DATE_FORMAT(membirth, "%c月%e日") as birday FROM MEMDB ORDER BY cdate membirthは、生年月日(例1989-01-01) cdate順にsortしたら、12月の人より、1月の人が先に出ます。 12月の人の次に1月の人が出るようにしたいですが。。。 あと、 検索条件も WHERE RIGHT(CURDATE(),5)=RIGHT(mbirth,5) OR RIGHT(DATE_ADD(CURDATE(), INTERVAL 1 DAY),5)=RIGHT(mbirth,5) OR RIGHT(DATE_ADD(CURDATE(), INTERVAL 2 DAY),5)=RIGHT(mbirth,5) OR ... みたいに、INTERVAL 30 DAYまででチェックしてますが、 正しい方法があれば、お教えてください。

  • 今日から7日分の誕生日を抽出したい

    いつもお力を借りています、すみません。 [mysql 5.1.22-rc] [PHP 5.2.5] で、運用しています。 テーブルは[member] で抽出したいフィールドは [birthday]で date型で[1978-12-26] の様に入れています、  そのデータの中から、今日から一週間以内に誕生日の来る方にメールを出そうとしていますが 抽出が出来ません。 今やってみたのは $from = date('Y-m-d'); $sql="SELECT * FROM member WHERE birthday BETWEEN $from AND (CURDATE() + INTERVAL 7 DAY)"; $rst = mysql_query($sql, $con); ****全レコードが出てきます。 何か見当違いな事をしているのでしょうか? 色々やっていますがうまく行きません。 ご教授、お願いいたします。

    • ベストアンサー
    • MySQL
  • 誕生日まであと何日か数えるプログラム

    誕生日まであと何日か数えるプログラムを作りたいのですが、わかりません。 Sub test() Dim NextBirthday As Date If もう今年の誕生日が来てるなら Then NextBirthday = Year(Date) + 1 & "/12/16" elseif まだ今年の誕生日が来てないのなら NextBirthday = Year(Date) & "/12/16" End If Debug.Print "誕生日まであと" & NextBirthday - Date; "日です。" End Sub みたいなことがしたいです。 まだ今年の誕生日が来てないならバージョンともう今年の誕生日が来てしまったら 次の誕生日まであと何日かバージョンを作りたいのですがどうすればいいのかわかりません

  • 今週の日曜日から土曜日までの要素の抽出

    次のようなテーブルがあります。 info{ name varchar(50) release date } 今週の日曜日(6/21)から土曜日(6/27)までの要素を抽出するため 次のようなSQL文を実行しました。 SELECT name FROM info WHERE release BETWEEN DATE_SUB( DATE(NOW()), INTERVAL DATE_FORMAT(NOW(), '%W') DAY ) and DATE_ADD( DATE(NOW()), INTERVAL WEEKDAY(NOW()) DAY ) この構文でエラーがでてしまいます。 BETWEENのand前後の指定は間違っていないと思うのですが どこが悪いのかわかりません。 ご教授願います。

    • ベストアンサー
    • MySQL
  • テキストボックスに日付・時刻を表示したい

    こんにちは。 PHP5+MySQLで開発を行っています。 MySQLより取得したdatetime型のDATEをテキストボックスに表示させたいのですが、日付のみ表示され時刻部分は表示されません。 何か特別な処理が必要なのでしょうか? *---------------------------------------------* 例:$row['DATE']="2009-12-04 13:04:56" <ソース> $date=$row['DATE']; print "<input type='text' name=date size='30' value=".$date.">"; <表示時> 2009-12-04 ("13:04:56"部分が表示されない)

    • ベストアンサー
    • PHP
  • エクセル関数で誕生日までの残りの日数を表示する方法は?

    エクセル関数で「=date()」で当日の年月日を表示できますが、次の誕生日までの残りの日数を自動表示させるには、どうしたらいいでしょうか?例えば、誕生日が2008年の6月14日だとして、教えていただければ幸いです。よろしくお願いいたします。

  • 誕生日を覚えていない彼氏

    彼氏がわたしの誕生日を覚えていませんでした。 知り合って一年、付き合って3カ月です。 お互いの誕生日は付き合う前から数回話題に上がっていて、記憶してくれていたものだと勝手に思ってしまいました。 昨日のデート中にわたしの誕生日の話になり、 「お前の誕生日って10月9日だっけ、9月? 覚えてないや!」 とヘラヘラ笑いながら言われてショックでした。 実際は6月です...。 わたしに対する気持ちはその程度なのかと悲しくなってしまい知らずと無口になってしまいました。 彼はわたしが怒ったと思ったようで、 それから「可愛いよ」やら「好きだよ」とやたら言い出し、 そう言っておけばわたしの機嫌が直ると思ったのか、余計に彼に対する不信感が募り涙を堪えながらなんとかデートを終えました。 わたしは彼の誕生日は覚えており、 プレゼントやどう祝うか今から色々考えていたため 誕生日の認識に差があったこともショックでした。 毎回、連絡をくれるのもデートに誘ってくれるのも彼からです。 手を繋いできたり、ハグしてきたりと愛情表現もよくしてくれます。 ただ本当にそれだけ好きなら誕生日を忘れるでしょうか。 自分はなんて面倒くさい女だろうかと思う反面、 やはり悲しくなってしまいます。 本当に好きな相手でも誕生日を覚えないことはありますか? 誕生日や記念日くらいで愛情を測るのは良くないでしょうか。

  • 冷めてしまった彼の誕生日

    冷めてしまった彼の誕生日 付き合って2年目になる彼がいるのですが、彼は半年たった頃から冷めていて、 用がなければ何週間も連絡をとらず、デートは月に1回くらいで、キスもセックスも多分1年くらいしてません。 とても付き合ってるとは言いがたいですが、彼は友人に彼女と紹介してくれるので、多分付き合ってます。 それと、私から遊ぼうと言うと大体付き合ってくれるので、 別れようと思いながらも言えずに、今に至ります。 そんな彼の誕生日がもうすぐなのですが、こんな状態でもプレゼントとかもらったら嬉しいのでしょうか?? すぐ20日後には私の誕生日がくるので、負担かけるだけだったらやめとこうと思うのですが・・・

  • 日付範囲で検索した後に降順にしたい

    日付範囲で検索した後に降順にしたい DBの状態 update |name|tensuu 2013-04-18 00:00:00 |田中|10 2013-04-22 00:00:00 |鈴木|20 2013-05-21 00:00:00 |佐藤|30 2013-05-22 00:00:00 |黒田|40 2013-05-22 00:00:00 |安部|50 2013-05-22 00:00:00 |向井|20 2013-05-23 00:00:00 |大井|90 php の記述 *DBに接続語を書いてます。 //1日前のデータを取得 $sql = mysql_query("select * from テーブル名 where update < DATE_SUB( CURDATE(),INTERVAL 1 DAY )"); while ($row = mysql_fetch_assoc($result)) { echo $row['name']."<br>\n"; echo $row['tensuu']."<br>\n"; } 原因 おそらく、日付範囲のデータを得た後で「tensuu」で降順ソート しなければならいと思いますが、そのやり方がわかりません。。 アドバイスお願い致します。。。

    • ベストアンサー
    • PHP

専門家に質問してみよう