• ベストアンサー

PHP+MySQLで、日時を比較して抽出したい

お世話になります。 現在、以下のようにテーブルにデータが入っているとします。 そこで、発生時間から30分経過したものを抽出するとき、どのようにSQL文を書けばいいのかずっと悩んでいます。 ただし、未回復のときは、回復時間のカラムにデータは入っていません。 DB名:サンプル テーブル名:テーブル 名称、発生時間、回復時間 (A、2005/08/10 10:10:10、2005/08/10 18:10:00) (B、2005/08/11 11:15:00、) (C、2005/08/13 22:50:18、2005/08/15 20:00:01) (D、2005/08/13 22:50:19、2005/08/13 23:00:00) Bは現在も、継続して発生中。 この中で30分以上継続しているものを抽出すると、 いろいろ考えたのですが、抽出する条件は ・回復しておらず、発生時間から30分以上経過しているもの ・回復時間から発生時間を引いて、30分以上の差があるもの だと思います。 ※指定する時間(30分経過等)は、30分の他に1時間経過、1日経過とか、選択できるようにしますが、わかりやすいように30分経過したもののみ扱うこととします。 わかりづらい質問で申し訳ありません。よろしくお願い致します。

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

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

とりあえず、回復時間がNULLなら、現在時刻(NOW())と見なすようにすればいけるのでは。 select * from T where SUBTIME( IFNULL( 回復時間, NOW() ), 発生時間)> SEC_TO_TIME( 30 * 60 ); ?なんか性能が低そうなクエリですが。

tomofriend
質問者

お礼

回答していただき、ありがとうございました。 自分がSQL言語が未熟なのがよくわかりました・・・^^; 理屈はよくわかったのですが、なぜかうまく動きませんでした・・・ 年月日の区切りが、データベースでは'/'なのですが、'-'でないと動かないとかあるのでしょうか? まだまだ勉強が足りませんががんばってみます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.2

SELECT 名称 FROM テーブル WHERE (ADDDATE(発生時間, INTERVAL 30 MINUTE) < NOW() AND 回復時間 IS NULL) OR ADDDATE(発生時間, INTERVAL 30 MINUTE) < 回復時間; でいけます。

tomofriend
質問者

お礼

回答していただきありがとうございました。 エラーはでなかったのですが、なぜか絞り込めませんでした。 発生時間、回復時間の 年月日を区切る記号が'/'なのですが、'-'でないとだめだとかあるんでしょうか?? もう少し考えてみます。ありがとうございます。

tomofriend
質問者

補足

UNIX_TIMESTAMP(DATE_FORMAT(IFNULL(kaifuku,NOW()),'%Y-%m-%d %H:%i:%s')) - (UNIX_TIMESTAMP(DATE_FORMAT(hassei,'%Y-%m-%d %H:%i:%s'))) > 1800) このようなSQLをつくったのですが、エラーはでないものの、絞り込めませんでした・・・疲れました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ポスグレ レコードの比較

    ポスグレDBで以下のような二つのテーブルがあって レコード数、カラム等の構造も同じだったとして カラム1の値が二つのテーブルで同じであり カラム2~4のうちどれか一つでも違うレコードを抽出するSQLがわかりません。 下記の例で言うと抽出結果がスキーマA.テーブルAの「←」のレコードを抽出したいです。 スキーマA.テーブルA カラム1|カラム2|カラム3|カラム4| --------------------------- A |aaaaaaa|bbbbbb|ccccccc --------------------------- B |aaaaaaa|bbbbbb|ccccccc      ← --------------------------- C |aaaaaaa|bbbbbb|ccccccc      ← --------------------------- D |aaaaaaa|bbbbbb|ccccccc      ← --------------------------- E |aaaaaaa|bbbbbb|ccccccc スキーマB.テーブルB カラム1|カラム2|カラム3|カラム4| --------------------------- A |aaaaaaa|bbbbbb|ccccccc --------------------------- B |1111111|bbbbbb|ccccccc --------------------------- C |aaaaaaa|777777|ccccccc --------------------------- D |2222222|bbbbbb|8888888 --------------------------- E |aaaaaaa|bbbbbb|ccccccc よろしくお願いします。

  • PHPでDBからデータを抽出してHTMLで表示する

    クライアント上で表示されているHTMLのテキストボックスに入力された文字列をホストに送信し、送信した文字列をSQLの抽出条件に設定してDB(MySQL)に登録しているデータ一覧をPHPで取得後、取得したデータ一覧をクライアントのHTMLのTABLEに一覧で表示したいのですが、どのようにPHPとHTMLをプログラムすればよいでしょうか? イメージ MysSQL テーブル カラム1|カラム2|カラム3| AAAAA|BBBBB|CCCCC| BBBBB|BBBBB|CCCCC| DDDDD|BBBBB|CCCCC| HTML テキストボックス カラム1「AAAA」 検索実行↓ HTML テーブル カラム1|カラム2|カラム3| AAAAA|BBBBB|CCCCC| AAAAA|BBBBB|CCCCC| 素人染みた質問で申し訳ございませんが、ご存知の方がいらっしゃいましたら終えてください。 以上

    • ベストアンサー
    • HTML
  • php mysql での日付検索について

    ご質問させていただきます。 あるテーブルにdatatime型のカラムがあり、現在時刻より古いものだけを抽出したいと思っておりますが、うまくいきません。 この場合、どのようなSELECT文を書けばよろしいでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP+MySQL 時間の比較がしたい

    PHPとMySQLでメルマガ送信システムをつくっています。 会員登録時にメルマガ配信希望時間を選択してもらい、DBにtime型でインサートしています。 [member]テーブル mail        fromtime  totime --------------------------------------- aaa@aa.co.jp   10:00:00  18:00:00 bbb@bb.ne.jp   01:00:00  12:00:00 ccc@cc.ne.jp   22:00:00  06:00:00 管理者がメルマガを送信の際、配信時間内に該当する会員だけにメールを送信させたいのですが、配信時間に該当する会員の抽出が上手くいきません。 SQL文での抽出: SELECT * FROM `member` WHERE (`fromtime` <= `$sendtime`) AND (`$sendtime` <= `totime`); ($sendtimeはdate関数で取得した送信時間が入っています) PHPでの処理:fromtime,totime,$sendtimeに今日の日付を追加して、タイムスタンプに変換して比較演算子を使うことを検討しましたが、日をまたぐこともあるので、そこで行き詰ってしまいました。 SQLでもPHPでもいいので、正確に配信時間内に該当する会員データを抽出できる方法はありませんでしょうか? どうかご教授お願い致します。

    • 締切済み
    • PHP
  • PHPでDBからデータを抽出してHTMLで表示

    こんにちは。 PHP初心者のものです。 クライアント上で表示されているHTMLのテキストボックスに入力された文字列をホストに送信し、送信した文字列をSQLの抽出条件に設定してDB(MySQL)に登録しているデータ一覧をPHPで取得後、取得したデータ一覧をクライアントのHTMLのTABLEに一覧で表示したいのですが、どのようにPHPとHTMLをプログラムすればよいでしょうか? イメージ MysSQL テーブル カラム1|カラム2|カラム3| AAAAA|BBBBB|CCCCC| BBBBB|BBBBB|CCCCC| DDDDD|BBBBB|CCCCC| HTML テキストボックス カラム1「AAAA」 検索実行↓ HTML テーブル カラム1|カラム2|カラム3| AAAAA|BBBBB|CCCCC| AAAAA|BBBBB|CCCCC| 素人染みた質問で申し訳ございませんが、ご存知の方がいらっしゃいましたら終えてください。 以上

    • 締切済み
    • PHP
  • PHP+MySQLで(特殊な)並べ替えをしたい

    例えば、ランクSS~Cの値を格納しているカラムで、 SS>S>A>B>C のような順序でソートをかけたいのですが、 カラムの増設をせずに実現できる方法はありますでしょうか。 それともランクで並べ替える用のカラムを 加えなければできないでしょうか。 なるべくなら、純粋なデータのみをDBに格納して 一機能のためだけのフィールドを作るのは 避けたいと思っているのですが。 可否がわかるかたいらっしゃいましたら お願い致します。

    • ベストアンサー
    • MySQL
  • PHP MySQL 配列データの比較

    就職支援のWebSiteを作っています。 【】 //companyテーブル company_id ----- 企業ID company_name -- 企業名 treatment ------ 待遇情報(配列を結合させた数字だけの情報) ・・・ //treatmentテーブル treatment_id ----- 企業ID treatment_data -- 待遇情報(日本語での正式名称) ・・・ 【待遇情報例】  交通費支給□ ボーナス有り□ 社宅・寮完備□ etc・・・ 【流れと状況】 (1) 企業側が待遇データをチェックボックスで選択して登録 (2) チェックボックスの値(配列)を連結させてtreatmentカラムに 001000111001000・・・ と言う形で格納 ここまでは出来ているのですが、検索する時複数並んだチェックボックスにチェックを入れてtreatmentカラム( 001000111001000・・・ )と比較させて、1が重なる企業だけを一覧を表示させたいのです。 ※001000111001000・・・の並び順はtreatmentカラムのレコード順(treatment_id)と対応させています。 経験不足の為良い考えが浮かびません。 こう言う場合はこう言う作りをした方が良い等、そう言ったご意見でもいただければ助かります。 宜しくお願いします。 ※企業(1):他カラム(多)であれば同じ格納方法~抽出まで出来ています。

    • ベストアンサー
    • PHP
  • 複雑な抽出条件のSQL文

    まだまだ初心者ですがよろしくお願いします。 以下の条件でDBからデータを抽出したい場合のSQLを 教えていただきたいです。 ・テーブルAがありカラムがA、Bとある。 ・Aは重複できないようになっているがBは重複可。 ・Bが重複しているレコードのAの値が欲しい。 環境はSQLServer2000+VB6.0です 情報が足りないかも知れませんがよろしくお願いいたします。

  • MySQLでデータを時間範囲で抽出したい

    mysqlでテーブルから、日付データが1ヶ月以内でかつ7時から8時までのデータを抽出する方法がわかりません。 テーブル内のtimeカラムにはタイムスタンプ型で日付が入っています。 time「2012-06-04 07:14:38」 time「2012-05-04 10:14:38」 time「2012-05-04 08:14:38」 time「2012-05-04 13:14:38」 SELECT * FROM table WHERE time >= DATE_ADD(NOW(),INTERVAL -1 MONTH) で1ヶ月以内のデータは抽出できたのですが、さらに7時から8時までのデータを抽出する方法が分からずかなり困っています。 どなたかご教授お願いいたします。

  • MySQL 複数フィールドで不一致の抽出

    ジャンル  id ジャンル名 日 数 id ----+---------------+--------------+---------+------- 001 ワンピース 20110518 10 a001 001 ワンピース 20110518 6 a002 002 アクセサリー 20110518 5 b002 仮に、このようなデータがあったとします。 数時間後には、↓のように変更がかかって送られてきます。 001 ワンピース 20110519 7 a001 001 ワンピース 20110518 6 a002 002 アクセサリー 20110519 9 b002 データ配布元の問題で、内容が更新された時点で、まだデータが確定していないものは、前日のデータが混ざって送られてきます。 この仕様を改良することは、残念ながら全く不可能です。 しかし、このデータをそのままテーブルに取り込んでしまうと、当然、2行目が重複してテーブルに収まってしまい、その後のデータ抽出に支障がでます。 例の場合でいえば、既に存在している2行目のデータを捨て、1行目と3行目のみを抽出する方法を探しています。 そこで、全部のデータを持つのをテーブル1とし、新しく着いたデータ(0519を含む方)をテーブル2に一時保管て、 SELECT テーブル2.ジャンルid, テーブル2.ジャンル名, テーブル2.日, テーブル2.数, テーブル2.ID FROM テーブル2 LEFT JOIN テーブル1 ON (テーブル2.ID = テーブル1.ID) AND (テーブル2.数 = テーブル1.数) AND (テーブル2.日 = テーブル1.日) AND (テーブル2.ジャンルid = テーブル1.ジャンルid) WHERE (((テーブル1.ジャンルid) Is Null)); と不一致SQLをAccessで行ったところ、1行目と3行目までが抽出できました。 ジャンルid、日、数、id が一致しないものを取りだすという不一致クエリの改造です。 ところが、同じSQLを、本番であるMySQLで行ったところ、データが抽出できす、反応が無くなってしまいます。 サンプルでは件数を絞りましたが、実際には1回分のデータが1万件近くあり、さらにメインテーブルは60万件ほどになるため、量が多すぎるためとも思いますが、4時間経ってもクエリの結果が返って来ないのは、MySQLとなにか合わないのではないかと思います。 MySQLで、上記と同じく、ジャンルid、日、数、id の全てが一致しないデータを抽出する事は可能でしょうか? ちなみに、MySQLテーブルでは、idの前にインクリメントのフィールドを置き、インデックスもインクリメントのフィールドで作成してあります。 よろしくお願いします。

このQ&Aのポイント
  • NVIDIAコントロールパネルの設定について教えてください。
  • Windows11でNVIDIA RTX3060Tiを使用中ですが、グラボ故障や相性問題はありませんか?また、ChromiumEdgeでのYouTube動画再生に問題が発生しています。
  • 購入したPCの構成や環境についても教えてください。
回答を見る