PHP5.5とMySQL5.0.95で、PDOで検索を掛けたいのですがwhere句でのdatetimeの扱いが分かりません。

site_idleは、intで秒数が入っています。
site_lasttimeは、datetimeで日時が入っています。
Whereに以下の条件をPDOで書くにはどのように書いたらよろしいでしょうか?

現在日時 > site_lasttime + site_idle

よろしくお願いします。


$sql_stmt = <<<EOS
SELECT
WM.site_id as site_id,
UM.user_id as user_id,
UM.accesslevel as accesslevel,
WM.site_title as site_title,
WM.site_url as site_url,
WM.site_idle as site_idle,
WM.site_lasttime as site_lasttime
FROM
website_master as WM
LEFT JOIN
user_master as UM ON WM.user_id = UM.user_id
WHERE
//現在日時 > site_lasttime + site_idle
ORDER BY
UM.accesslevel DESC
EOS;

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2014/09/23 01:04:56
  • 終了:2014/09/24 16:54:21

ベストアンサー

id:sasada No.1

sasada回答回数1482ベストアンサー獲得回数1332014/09/23 02:53:31

ポイント100pt

 今家にいて検証できないんですが、イメージはこんな感じでしょうか。

 「検索したい日時」は、PHP側で作成して文字列にしておきます。

$現在時刻のコピー = $現在時刻;
$検索したい日時文字列 = date("Y-m-d H:i:s",
                              date_sub($現在時刻のコピー, # 注意!date_subで変更されます!
                                       new DateInterval('PT' . site_idle . 'S')));

 で、ヒアドキュメント内で条件式を指定してやります。
 確か「'」でくくるのだと思いましたが、違ったかもしれません。
 「#」でくくるか、何もくくらないかだったかもしれません。(あやふや)

$sql_stmt = <<<EOS
SELECT
(略)
WHERE
  site_lasttime < '{$検索したい日時文字列}'
(略)
EOS;

 頼りない回答ですが、少しでも参考になれば幸いです。

他1件のコメントを見る
id:sasada

 ああ、なぜかビッグな勘違いをしてました。
 大変失礼しました。

 site_idleもsite_lasttime同様テーブルから取得するんですね。
 その場合、たぶんMySQLの組み込み関数を使うことになります。

$sql_stmt = <<<EOS
SELECT
(略)
WHERE
    TIMEDIFF(NOW() , WM.site_lasttime) > SEC_TO_TIME(WM.site_idle)
(略)
EOS;

くらいでしょうか。あいかわらず試せて無くて申し訳ないです。
 SQL文がMySQLに依存するのがデメリットですが、全件抽出してPHPで条件判断するよりは良いかもです。

2014/09/23 12:09:13
id:wsapp

ご回答ありがとうございます。
やっと動作確認しました。
報告に時間がかかったのは日時に"0000-00-00 00:00:00"が入っていた場合、そのレコードを拾ってこないのですね。
where句に以下を追加してとりあえずしのぎました。

WHERE
OR WM.site_lasttime = "0000-00-00 00:00:00"

ありがとうございました。
無事解決しました。

2014/09/24 16:54:08

その他の回答(0件)

id:sasada No.1

sasada回答回数1482ベストアンサー獲得回数1332014/09/23 02:53:31ここでベストアンサー

ポイント100pt

 今家にいて検証できないんですが、イメージはこんな感じでしょうか。

 「検索したい日時」は、PHP側で作成して文字列にしておきます。

$現在時刻のコピー = $現在時刻;
$検索したい日時文字列 = date("Y-m-d H:i:s",
                              date_sub($現在時刻のコピー, # 注意!date_subで変更されます!
                                       new DateInterval('PT' . site_idle . 'S')));

 で、ヒアドキュメント内で条件式を指定してやります。
 確か「'」でくくるのだと思いましたが、違ったかもしれません。
 「#」でくくるか、何もくくらないかだったかもしれません。(あやふや)

$sql_stmt = <<<EOS
SELECT
(略)
WHERE
  site_lasttime < '{$検索したい日時文字列}'
(略)
EOS;

 頼りない回答ですが、少しでも参考になれば幸いです。

他1件のコメントを見る
id:sasada

 ああ、なぜかビッグな勘違いをしてました。
 大変失礼しました。

 site_idleもsite_lasttime同様テーブルから取得するんですね。
 その場合、たぶんMySQLの組み込み関数を使うことになります。

$sql_stmt = <<<EOS
SELECT
(略)
WHERE
    TIMEDIFF(NOW() , WM.site_lasttime) > SEC_TO_TIME(WM.site_idle)
(略)
EOS;

くらいでしょうか。あいかわらず試せて無くて申し訳ないです。
 SQL文がMySQLに依存するのがデメリットですが、全件抽出してPHPで条件判断するよりは良いかもです。

2014/09/23 12:09:13
id:wsapp

ご回答ありがとうございます。
やっと動作確認しました。
報告に時間がかかったのは日時に"0000-00-00 00:00:00"が入っていた場合、そのレコードを拾ってこないのですね。
where句に以下を追加してとりあえずしのぎました。

WHERE
OR WM.site_lasttime = "0000-00-00 00:00:00"

ありがとうございました。
無事解決しました。

2014/09/24 16:54:08
id:wsapp

質問者から

wsapp2014/09/23 11:36:43

Where句の文字に誤りがありました。

//現在時刻 > site_lasttime + site_idle


//現在日時 > site_lasttime + site_idle

失礼いたします。
質問を修正しておきます。

id:wsapp

質問者から

wsapp2014/09/23 09:55:30

質問文を編集しました。詳細はこちら

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません