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]