• 締切済み

直近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
  • ありがとう数11

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>直近の1ヶ月に誕生日を迎える の定義次第ですね ・今月と誕生月が一緒の場合、今日の日付が誕生日の日付より小さい ・来月と誕生月が一緒の場合、今日の日付が誕生日の日付と同じか大きい ということでよければ、こんな感じ? (過去1カ月も取りたいとなるともうちょい工夫が必要) //元データ create table office (birth date,name varchar(20)); insert into office values('1960-03-02','山田'),('1970-03-15','菊池'),('1980-03-22','田中'); //今日が2014-02-10の場合 SELECT office.* from office where month(@d:='2014-02-10')=month(birth) and day(@d)<day(birth) or month(@d)+1=month(birth) and day(@d)>=day(birth) order by birth asc; →山田 //今日が2014-02-28の場合 SELECT office.* from office where month(@d:='2014-02-10')=month(birth) and day(@d)<day(birth) or month(@d)+1=month(birth) and day(@d)>=day(birth) order by birth asc; →山田、菊池、田中 //今日が2014-03-02の場合 SELECT office.* from office where month(@d:='2014-02-10')=month(birth) and day(@d)<day(birth) or month(@d)+1=month(birth) and day(@d)>=day(birth) order by birth asc; →菊池、田中 //今日を調整しない SELECT office.* from office where month(@d:=curdate())=month(birth) and day(@d)<day(birth) or month(@d)+1=month(birth) and day(@d)>=day(birth) order by birth asc;

関連するQ&A

  • 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
  • Smartyで「20時01分」を「20時1分」と表示したい

    Smartyのdate_formatで、日付をフォーマットしております。 1桁の場合、0をつけないで表示したいのですが、現在は 修正子 |date_format:"%Y年%m月%d日 %H時%M分"を利用しているのですが、 2005年02月02日 20時01分 と表示されてしまいます。 これを、 2005年2月2日 20時1分 と表示させるのは、どのようにしたらよろしいのでしょうか。

    • ベストアンサー
    • PHP
  • エクセル:別ファイルからの抽出

    エクセル:別ファイルからの抽出 エクセルにて、 あるファイルに A  B    C No 月    氏名    1 2010/11  佐藤 2 2010/10  山田 3 2011/12  田中 4 2010/10  田中 ・ ・ とあり、それを別ファイルで 2010/10とセルに入力してやると、B列の2010/10だけ抽出して 一覧にしてくれるようにしたいと考えております。 関数またはVBAにて処理する方法はありますでしょうか? A  B    C No 月    氏名    2 2010/10  山田 4 2010/10  田中 ・ ・ ※別ファイルにおいては順番は関係ないので、Noがなくても よいです。 恐縮ですが、お答え願えれば有難いです。

  • Excelの抽出(関数)について

    下記のAという表からBの表へ各自の4月度、5月度の結果を反映させたいのですが、 関数では複数条件になり、無理なのでしょうか? 【A】 A B C D 1 名前 日付 結果 月 2 田中 4/10 200 4月度 3 山田 4/12 210 4月度 4 小林 4/14 240 4月度 5 田中 5/10 180 5月度 6 小林 5/20 220 5月度 【B】 1 名前 4月度 5月度 2 小林 240 3 田中 200 4 山田 210 よろしくお願いいたします。

  • 【EXCEL】シフト表から休みの日だけを抽出する方法をご教授ください。

    いつも大変お世話になっています。 申し訳ありません。どなたかお力をお貸しください。 1ヶ月のシフト表から休みの日を抽出したいのです。 休みの日の記号は常に【X】です。(=Xを抽出したいのです) 出勤日の記号は英数字で、最大5桁まであります。 【拡大図】   A  B    C      D      E      F 1 No 氏名  2009/4/1 2009/4/2  2009/4/3 2009/4/4    2 123 山田   A      B     B      B 3 124 佐藤   A      B     B      X 4 125 田中   X       X     A      A 5 128 清水   C       B     X      A 6 025 上田   C       B     X      A 【縮小図】 A  B   C DEFGHIHIJKLMNOPORSTU 1  NO 氏名 日日日日日日日日日・・・・・・ 2 123 山田 ABBBAXXAAAAAXXBBBBBXXAAAAAXXAA 3 124 佐藤 ABBXXAAAAAXXBBBBBXXAAAAAXXAABB 4 125 田中 BXXAAAAAXXBBBBBXXAAAAAXXAABBAA 5 128 清水 CBXABBBBXXXBBBBCCCCXAAAAAXXXAA 6 025 上田 CBXABBXBAAABBXBCXCCXAAAAAXXXAA 【やりたいこと】 ※No(=社員No)、氏名、休みの日を別シートに表示したいのです。 ※オートフィルタを使って、日毎に手動でやることは避けたいです。    A  B   C 1  No 氏名 休日     2  123 山田 2009/4/6 3  123 山田 2009/4/7 4  123 山田 2009/4/13 5  123 山田 2009/4/14 6  123 山田 2009/4/20 7  123 山田 2009/4/21 8  123 山田 2009/4/27 9  123 山田 2009/4/28   10 124 佐藤 2009/4/4 11 124 佐藤 2009/4/5 12 124 佐藤 2009/4/11 13 124 佐藤 2009/4/12   ・   ・   ・   ・   申し訳ありませんが、 どなたかご教示をお願いします。

  • 今日から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
  • PHP mysql 時刻表示方法

    データベースに登録されている時刻を表示する方法についてご質問があります。 PHPは初心者です。 コードは以下になります。 $row = mysql_fetch_array($result_member); if ($row) { $m_reg_date = $row['reg_date']; $m_edit_date = $row['edit_date']; } } $str_reg = $m_reg_date; list($m_reg_year,$m_reg_month,$m_reg_day) = explode("-",$str_reg); $format_reg = "%04d年%02d月%02d日"; $str_edit = $m_edit_date; list($m_edit_year,$m_edit_month,$m_edit_day) = explode("-",$str_edit); list($m_edit_hour,$m_edit_minute,$m_edit_second) = explode(":",$str_edit); $format_edit = "%04d年%02d月%02d日 %02d:%02d:%02d"; という記述をしており、 <?php printf($format_edit, $m_edit_year, $m_edit_month, $m_edit_day, $m_edit_hour, $m_edit_minute, $m_edit_second); ?> で表示させています。 しかし、こちらの表示方法だと 2010年04月03日 2010:43:22 と表示されてしまい、時刻の**時がなぜか西暦になってしまいます。 こちらを24時間方式の表示に変更したいのですが、 お分かりのかたいらっしゃいましたらご教授お願いいたします。

    • ベストアンサー
    • PHP
  • Accessのフォームのオープンのコマンド。

    テーブル1 ・名前 ・誕生日 ・年齢 フォーム1 ・名前 ・誕生日 ・年齢 ・コマンドボタン コマンドボタンのコード Private Sub コマンド6_Click() Age_Keisan End Sub 関数Age_Keisanのコード Private Sub Age_Keisan() Dim Age As Integer Dim Birth_Y As Integer Dim Birth_M As Integer Dim Birth_D As Integer Dim Now_Y As Integer Dim Now_M As Integer Dim Now_D As Integer Birth_Y = Left([誕生日], 4) Birth_M = Right(Left([誕生日], 7), 2) Birth_D = Right([誕生日], 2) Now_Y = Left(Date, 4) Now_M = Right(Left(Date, 7), 2) Now_D = Right(Date, 2) Select Case Birth_M Case Is < Now_M Age = Now_Y - Birth_Y Me![年齢] = Age Case Is > Now_M Age = Now_Y - Birth_Y - 1 Me![年齢] = Age Case Is = Now_M Select Case Birth_D Case Is <= Now_D Age = Now_Y - Birth_Y Me![年齢] = Age Case Is > Now_D Age = Now_Y - Birth_Y - 1 Me![年齢] = Age End Select End Select End Sub となっています。 これですと、年齢を入れて、ボタンを押さないと誕生日が過ぎた場合、年齢が増えていきません。 クエリーを使用してフォームをつくればよかったのですが、テーブルから直接フォームを作成しているので 計算もできません。 できればフォームのオープンコマンドに上記のボタンと同じような機能を入れたいのですが、 どのようにすればいいのでしょうか?

  • date関数で、曜日を日本語表示でループさせる。

    いつもお世話になります。 さて、date関数で、曜日を日本語表示でループさせ、日曜日だけ外す方法で悩んでおります。 今日から、順番に日付を表示させるのは、下記でできたのですが、 <?PHP $nday = mktime(); for($i=0;$i<5;$i++){ print "<option>".date("m月d日 (D)", mktime(0,0,0,date("m"),date("d")+$i,date("y")))."<br />"; } ?> 例) 04月18日 (Wed) 04月19日 (Thu) 04月20日 (Fri) 04月21日 (Sat) 04月22日 (Sun) 日本語表示にさせようとすると、曜日がループしません。 <?PHP $nday = mktime(); $youbi = array("日","月","火","水","木","金","土"); for($i=0;$i<5;$i++){ print "<option>".date("m月d日 (".$youbi[date(w)].")", mktime(0,0,0,date("m"),date("d")+$i,date("y")))."<br />"; } ?> 例) 04月18日 (水) 04月19日 (水) 04月20日 (水) 04月21日 (水) 04月22日 (水) また、ここから日曜日だけ外すことはできますか? お手数ですが、ご教示ください。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • エクセルの条件付書式で色をつけたいのです

    エクセル初級者です。 以下のような表があるとします。 A ------B------C--------D--------E--------F--------G--------H ..... 1     name  birth    2012/1/1 2012/2/1 2012/3/1 2012/4/1 2012/5/1 ..... 2   山田  1965/5/18 3   鈴木  1988/3/10 この、D1・E1・F1・H1・・・以降セルについてですが ユーザー設定の書式で【m"月"】として【○月】と表示しています。 色をつけたいのは、誕生月に該当するセルです。 山田さんの場合、H2に 鈴木さんの場合、F3に色をつけたいのです。 何か補助となるセルも作るべきなのでしょうか? 全くお手上げです。 どうぞ、どなたかお助けくださいませ。