【发布时间】:2011-04-10 00:51:33
【问题描述】:
我正在努力弄清楚如何使用 perl 将 MySQL 日期与当前系统时间进行比较。
我有一个在 cron 作业上运行的脚本,如果当前系统日期/时间超过返回记录的日期/时间,它将发送通知:
应用程序显示表格视图:
EventId Device Location
CC: 123 something BFE
TT: 456 anotherthing BFE
脚本的工作原理是在 EventID 字段中查找值,从 ID(数字部分)解析类型(CC:、TT: 等)。 ID 是另一个包含结束时间字段的数据库/表中的唯一 ID。 EventID 本身不是唯一的,并且可能在表中具有重复项。每个“类型”都有子例程,因为每种类型都有不同的数据库和/或表。
目标是脚本每分钟运行一次并切换 Expired 的值。某些内容可能会过期、进行更改然后过期。
脚本工作正常,除了 1 个问题,根据我到目前为止收到的反馈,这似乎与时区有关。如果我没有将当前系统时间的时区隐式设置为 'America/New_York'($now),它会关闭几个小时 ($notz)。因此,我需要找到一种方法,让 MySQL 返回的日期与当前系统时间准确地进行比较。
$now->set_time_zone('America/New_York') 似乎也不起作用。
我不确定如何做到这一点,或者即使到目前为止我拥有的代码是最好的方法(对 Perl 来说还是相当新的):
#!/usr/bin/perl
use DBI;
use DateTime;
use DateTime::Format::MySQL;
use Switch;
my $now = DateTime->now(time_zone => 'America/New_York');
my $notz = DateTime->now();
my $maindb = DBI=>connect(database);
my $seteventsql = qq { select * from view where EventId like 'IE:' or EventId like 'TT:' or EventId like 'CC:';};
my $commit = $livedb->prepare($seteventsql);
$commit->execute() || die "could not set event: $DBI::errstr";
while(@events = $commit->fetchrow_array()) {
(my $type, my $id) = split (/ /,$events[0]);
$id =~ s|\D||g;
switch ($type) {
case ('CC:') {check_expired_case($id);}
case ('TT:') {check_expired_task($id);}
case ('IE:') {check_expired_event($id);}
}
}
sub check_expired_case {
my $id = shift; #id = 123
my $sql = qq { select id, status_id, item_enddate from item where id = ?; };
my $exec = $itemdb->prepare($sql);
$exec->execute($id);
while(my @row = $exec->fetchrow_array()) {
my $status = $row[1];
my $end = DateTime::Format::MySQL->parse_datetime($row[2]);
if ($now > $end || $status ne 3 || $status ne 6) {
$sql = qq { update item set Expired = 1 where EventId = '$eventid';};
$maindb->do($sql)
}else{
$sql = qq { update item set Expired = 0 where EventId = '$eventid';};
$maindb->do($sql)
}
}
$exec->finish();
}
NoTZ: 2010-09-10T01:27:19
Now: 2010-09-09T21:27:19
End: 2010-09-10T17:00:00
提前致谢。我希望我已经解释得足够好,很难解释一切之间的关系。
【问题讨论】:
-
所以澄清一下,您的代码将进入“做某事”路径,而不是“做其他事情?
-
无论当前时间是在结束时间之前还是之后,我所拥有的实际生产脚本都会将值设置为 1 或 0 的数据库。
-
@mose:我正在尝试确认您的代码错误地表示 2010-09-08T20:03:38 > 2010-09-10T17:00:00?
-
抱歉重复发布,点击回车提交而不是插入换行符。两者都做某事,并做其他事情调用单独的 SQL 语句,该语句将更新记录集,其值为 1 或 0,用于识别当前记录是否过期。 if 语句中的代码片段本身与日期无关。