[前][次][番号順一覧][スレッド一覧]

mysql:4003

From: YONEMOTO Kazumasa <YONEMOTO Kazumasa <yonemoto@xxxxxxxxxx>>
Date: Fri, 13 Jul 2001 21:15:00 +0900
Subject: [mysql 04003] Re: INTERVAL がうまく動きません

米本と申します。

From: Tybalt of Capulet <ice-man@xxxxxxxxxx>
Subject: [mysql 03989] INTERVAL がうまく動きません
Date: Fri, 13 Jul 2001 01:01:33 +0900

> 下記の様なスクリプトをcronで動かしています。
> ところがこれをAM2:45に動かすとデータが全て削除されてしまいます。
> サンプルデータからするとINTERVALが1なのでidが1と2のデータが消えて
> 3は残って欲しいわけです。
> --------------ここから------------------------------
> ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
> $mon = $mon + 1;
> $year += 1900;
> $mon = substr('0'.$mon,-2,2);
> $hour = substr('0'.$hour,-2,2);
> $nowday = $year.$mon.$mday.$hour.$min.$sec;
> 
> # 1時間以上経過しているAテーブルのデータの削除
> $sth = $dbh->prepare( qq{
>   DELETE FROM A WHERE (inputday + INTERVAL 1 HOUR) < ?
> }) || die "Can't prepare statement:" . $dbh->errstr . "\n";
> 
> (snip)
> 
> INTERVALとtimestamp型の使い方が間違っているのでしょうか?
> どなたかおわかりのかた教えていただけませんでしょうか?

直接的な答えになりませんが、次のような使い方は参考になりませんか。

$query = "DELETE FROM popwatch WHERE DATE_ADD(timestamp, INTERVAL 1 hour) < NOW()";
#print "$progname: $query\n";
$db->do($query);

これに対するpopwatchとは

CREATE TABLE popwatch (
  id        INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
  timestamp TIMESTAMP,
  handle    VARCHAR(255) NOT NULL,
  host      VARCHAR(255) NOT NULL,
  ip        VARCHAR(255) NOT NULL
);

これはPOP before SMTPといって、POPアクセスしてくる人を認証してSMTPで
中継を許すデータベースを、整理するためのPerlスクリプトの一部です。

もし「inputday + INTERVAL 1 HOUR」というような使い方をしたいのであれ
ば、一旦UNIXタイムスタンプに変換してから+3600秒でしょうか。
そうしないとtimestamp型の場合、ぐちゃぐちゃになってしまって、うまく
動かない気がしますけど。確認はしてないです。

--------
  米本和正 (YONEMOTO Kazumasa)
  yonemoto@xxxxxxxxxx, yonemoto@xxxxxxxxxx

[前][次][番号順一覧][スレッド一覧]

      3989 2001-07-13 01:01 [Tybalt of Capulet <i] INTERVAL がうまく動きません             
->    4003 2001-07-13 21:15 ┗[YONEMOTO Kazumasa <y]                                       
      4005 2001-07-14 00:40  ┗[Tybalt of Capulet <i]