• ベストアンサー

開始日と終了日が設定されているデータの扱いについて

開始日と終了日が設定されているデータの扱いについて教えてください。 すでに複数登録されているデータには、開始日と終了日というフィールドが登録されています。  → "開始日","終了日","箱1","箱2" → "051101","051130","a1","a2" → "051201","051231","b1","b2" 新しいデータを追加する際、すでに登録された期間に被っていた場合はエラー表示させたいのですが、そのやり方がわかりません。 (※12月1日~12月31日までというデータがすでに登録されていた場合、  11月1日~12月15日というデータは登録できない、という感じです) とりあえず下記のようにやったりしているのですが、 どうも思ったように動いてくれません また、SELECTを使うものなのか疑問に思っています。 $start_date = "2005-12-01" $end_date = "2005-12-31" $hoge = "SELECT * FROM table_name WHERE ( date_start<='"$start_data"' AND date_end>='"$start_data"' ) OR ( date_start<='"$end_data"' AND date_end>='"$end_data"')"; $db_query = sql_query($hoge,$ID); $array_result = mysql_fetch_array($db_query); if(empty($date_start_check) != TRUE ){ die("この期間内のデータはすでに登録されています。"); } 何卒、良いやり方を教えてくださいm(_ _)mペコリ

  • MySQL
  • 回答数4
  • ありがとう数1

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

  • ベストアンサー
  • asdf24
  • ベストアンサー率54% (27/50)
回答No.3

>( date_start<='"$start_data"' AND date_end>='"$start_data"' ) OR >( date_start<='"$end_data"' AND date_end>='"$end_data"')"; この式だと、追加するデータの期間に収まってしまうデータがすり抜けます。 (たとえば、12月2日~12月30日までというデータがすでに登録されていた場合でも、 12月1日~12月31日というデータが登録できます) あと気になったのは >if(empty($date_start_check) != TRUE ) ここでいきなり $date_start_check というのが出てきてますが 実際のプログラムでは $array_result となってるのをタイプミスをしたのでなければ、実行は出来ますがSQLに関係なくif文は成立しません。 $hoge = "SELECT date_end, date_start FROM table_name WHERE date_end>='$start_date' AND date_start<= '$end_dated'"; $db_query = mysql_query($hoge,$ID); if( mysql_num_rows($db_query) ){ die("この期間内のデータはすでに登録されています。"); } とりあえずこんな感じで動くと思います。

dororon999
質問者

お礼

ありがとうございます。 無事、動くようになりましたm(_ _)mペコリ

その他の回答 (3)

  • fire--
  • ベストアンサー率49% (146/293)
回答No.4

asdf24さんのが正しいロジックですね。 うっかり、見落としていました。 失礼しました。

  • fire--
  • ベストアンサー率49% (146/293)
回答No.2

後者については、普通のキーならばduplicateエラーとか ありますが、こういう期間の場合の手は知りません。 ベテランなら良い手を知っているかもしれません。 現在、期間が重なって登録できるとの事ですが、基本的な式は どうみても間違ってないので、コーディングに何か問題が あるように思えます。それを確認するには、プログラムを コピー&ペーストしてもらえば判るかもしれません。 確認するに

  • fire--
  • ベストアンサー率49% (146/293)
回答No.1

ここに書いたとおりのコーディングでしょうか? だとすると、基本的な考えは良いのですが、ミスがありますね。 まず日付のデータですが、データベースの中身は yymmdd の 形式で、プログラム中で代入しているのは、yyyy-mm-dd に なってますね。合わせましょう。 次に変数名です。値を代入するときは $start_date ですが、 SQL文中は$start_dataで、eとaが違ってます。endのほうも 同じです。 まず、そこを確認しましょう。

dororon999
質問者

補足

すみません。 上記、記載しているものは書き込み用に編集したときにタイプミスしたもので、実際は通常に動いています。 しかし、SQL文の条件部分がやりたいことを満たしてないので、期間が重なっても登録できてしまいます。 また、上記ではSELECT文で読み出した後に、mysql_fetch_arrayを使って配列として取得した後、取得できたならエラーというの作業をしていますが、クリエ実行段階でデータがあればFALSEを返すみたいなものがあれば、そこでエラーを出せる気がしたので、他にそのようなやり方があれば教えてくださいm(_ _)mペコリ

関連するQ&A

  • PHP5+MySQLで現在日時とDB内の開始日時と終了日時との比較の方

    PHP5+MySQLで現在日時とDB内の開始日時と終了日時との比較の方法を教えてください。 table_a id start end ----+--------------------+---------------------+ 001 2010-01-01 10:00:00 2010-01-03 18:30:00 002 2010-01-01 12:00:00 2010-01-05 20:00:00 ・ ・ というデータがある時、 現在の日時がid:001のstartとendの間だったら1、 start前だったら0、endより後だったら2の値を表示させるにはどうしたらいいのでしょうか? $sql = "SELECT A.id ,A.start ,A.end FROM table_a A WHERE A.id = ".$id." "; $result = mysql_query($sql); で取得して time()などと比較すればいいとは思ってますが、DBから持ってきた日付との比較方法がわかりません。

    • ベストアンサー
    • PHP
  • CakePHPで毎年同じ月日を判定する方法

    毎年ある時期がくると「開催中」という文字が自動表示される処理を考えているのですが、うまく表示できずに悩んでいます。 具体的にいうと、DATE型の「start」と「end」フィールドを今日の日付とを比較し、「start」と「end」の期間中であればそのテーブルに含まれる文字列(title)を表示するという具合です。 以下の段階では、年まで一致すれば問題なく表示されるのですが、年が変わると当然ながら表示されなくなってしまいます。 テーブル 「title(タイトル)」「start(開始日)」「end(終了日)」 コントローラ $date = date("Y-m-d", mktime(0,0,0, date("m"), date("d"), date("Y"))); $conditions = array('hoge.start <' => $date,'hoge.end >' => $date); $this->set('data',$this->hoge->find('all',array('conditions'=>$conditions))); ビュー foreach($data as $data){ echo $data['hoge']['title']"; } 年に関係なく、月日だけで繰り返し判断するにはどうすればよいのか、ぜひご教示ください。

    • ベストアンサー
    • PHP
  • Mysqlで掲載開始日と掲載終了日が設定されている商品レコードを抽出し

    Mysqlで掲載開始日と掲載終了日が設定されている商品レコードを抽出したい Perl+Mysqlでデーターの抽出する際に困っております。 商品テーブル(item)がありその中には、date型のstart_dateとlast_dateのカラムがあります。 +-----+----------+-----------+ |itemid | start_date |  last_date   | +-----+----------+------------+ | a001 | 2010-08-31 | 2010-09-31  | | a002 | 2010-09-01 | 2010-09-21  | | b002 |  NULL    |   NULL    | | c003 |  NULL    |  2010-09-03  | +-----+------------+------------+ まず、本日が2010/08/30だったとしたばあい、b002とc003は表示されるようにしたいのです。 Perl上で start_date とlast_dateの期間内であればprintすればいいというこではなく、 あくまでslq文上一回のQueryでそれを実現したいのです。 といいますのも、ページ送り(ページャー)を表示させるために予め 抽出条件の全レコードの件数を取得する必要があります。 大変恐れ入りますが、ご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • Accessクエリーにて開始日と終了日から期間を算出

    Accessのクエリーにて、開始日と終了日から該当月の貸し出し期間の算出方法を教えて下さい。 条件ですが、 月単位での算出の為、1ヶ月は「1」、半月は「0.5」で算出します。 当月に開始された明細では、 15日までに開始されれば1ヶ月で算出 16日以降に開始されれば半月で算出 当月に終了された明細では、 15日までに終了されれば半年で算出 16日以降に終了されれば1ヶ月で算出 同月内に開始・終了の場合は1ヶ月で算出 貸し出し中の明細の場合、「終了日」はNULLです。 算出年月 200712の場合のデータは下記の通りです 「算出年月」、「開始日」、「終了日」、 200712、20071210、、、期間は「1」 200712、20071220、、、期間は「0.5」 200712、20050505、20071219、期間は「1」 200712、20061222、、、期間は「1」 200712、20071201、20071210、期間は「1」 宜しくお願い致します。

  • 開始日(Date型)から終了日(Date型)までを1日毎に表示

    Dateオブジェクトが2つあり↓ (1) 開始日を表すDate型オブジェクト  例.2003/4/10 (2) 終了日を表すDate型オブジェクト  例.2003/5/20 (1)の開始日から(2)の終了日までの日にちを表示したいのですが・・ 例えば、以下のような感じです。 for ( 開始日から終了日までループ ) { 開始日に1日づつ足していき、終了日まで達した場合は、ループを抜ける } <表示例> 2003/4/10 2003/4/11 2003/4/12   ・   ・ (省略)   ・   ・ 2003/5/18 2003/5/19 2003/5/20 これを実現するには どうすればいいでしょうか・・

  • 開始日と期間で終了日を求める方法を教えて下さい。

    こんにちは、開始日と期間で終了日を求める方法を教えて下さい。 java1.4を使用しています。 開始日:2008-08-01(String) 期間:14(int) 営業日だけの数値です。 休日はDBから取得ができ、 月~日までのカラムがあり 休日の場合は、「0」そうでない場合は「1」になっています。 * 休日は任意で「土曜、日曜」だけとは限りません。 上記の数値で計算すると、2008-08-14になりますが、 休日も含めた日数で表示をさせたいです。 表示させたい結果:2008-08-20 本当に、困っています。どうぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • 数値データを日付データとして扱いたい。

    違うDBからファイルをDLしてきて、テーブルに入れているデータがあります。 その違うDBの日付データが分割してインポートされてしまいます。   2 | 9 | 18 ↑こんな感じです。 これを日付データとして扱いたいのです。(2002/09/18というように。) 表示だけでしたらクエリーとかに [年]&"/"&[月]・・ とかってやればいいのですが、そうではなくて、日付のデータとしたいのです。 Excelですと「Date」関数というのがあって、それに 「Date(年,月,日)」と入れれば、日付データとなると思うのですが、Access にはこのような関数はないのでしょうか?

  • テーブルのデータをarray (array (***, ***)) の形式で取得したい

    id、氏名、年月日(date)、点数(tensu)の列を持つテーブルseiseki があります。 <?php $conn_id = mysql_connect("localhost","root","*****") or die('Error connecting to MySQL'); mysql_select_db('******',$conn_id); $query ="SELECT date,tensu from seiseki; $result = mysql_query($query,$conn_id) or die($query.'failed('.mysql_error().')'); $date = array(); $tensu = array(); while($row = mysql_fetch_array($result)){ $date[] = $row['date']; $tensu = $row['tensu']; } print_r($date); echo "<br/>\n";      ←15行目 print_r($tensu); echo "<br/>\n";      ←16行目 ?> これをブラウザで見ると、 Array ( [0] => 2009-05-01 [1] => 2009-06-07 [2] => 2009-07-24 ・・・・・・ ) Array ( [0] => 80 [1] => 75 [2] => 90 ・・・・・・・ ) となります。 15,16行目をコメントアウトして print_r($row[“date”],[“$tensu”]); とするとエラーになります。 array (array (2009-05-01, 80), array (2009-06-07, 75 ), array (2009-07-24 , 90)・・・・・・・ ); の形式でデータを取得するにはどのようにすれば良いでしょうか?

    • ベストアンサー
    • MySQL
  • テーブルに入っているデータと重複チェックしたい

    やりたいこと: phpを実行して取得したデータの内容と既にDBのテーブルに格納されているデータを 比較して、 異なっていれば、新しいデータとして INSERT INTO文で テーブルにデータを登録する。 同じであれば、登録しない。 という処理がしたいです。 $sql = "select * from hoge where url= $page_uri"; $kakunin = mysql_query($sql , $db ); if ( $page_uri == $kakunin ){ //同じデータならスキップ break; } else{ $sql = mysql_query("INSERT INTO hoge VALUES (0,'$page_uri','$pon')"); と書いているのですが、以下のエラーが出てしまいます。。 Fatal error: Cannot break/continue 1 level in /www/xx.php on line 42 これは、breakは使えないよ ってことでしょうか? breakでなくても やりたいことが実現できればこだわりはないのですが、、 アドバイスよろしくお願いします。

    • 締切済み
    • PHP
  • データの取得に関して

    データを取得する際、表示開始日の午前10時になったらデータを取得するような形にしたのですが、 下記のようにすると、その日になると同時に取得してしまいます。(10時より前に) 例えば、表示開始日が11月1日だった場合、 11月1日の10時になったら表示するようにしたいのですが、どういう感じにすればいいでしょうか。 <?php $time=date("H"); if($time>9) { select * from test where start<=getdate() } else { select * from test where start<getdate() }

    • 締切済み
    • PHP