我在努力弄清楚如何使用perl比較MySQL日期和當前系統時間。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
在此先感謝。我希望我已經很好地解釋了這一點,它很難解釋所有事情的關係。
所以要澄清,你的代碼將在「做什麼」的路徑,而不是「做點別的? – Ether 2010-09-09 00:59:03
實際生產中的腳本我有設置一個值的1或0數據庫的當前時間是否是之前或結束時間後 – Mose 2010-09-09 01:06:54
@mose:我想確認你的代碼錯誤地說,2010-09-08T20:03:38> 2010-09-10T17:00:00 – Ether 2010-09-09 01:08:20