• ベストアンサー

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

専門家に質問してみよう