преобразование даты Oracle в время linux
У меня возникли проблемы с преобразованием поля даты Oracle в формат времени linux в perl. Я вытягиваю поле даты следующим образом:
my $query = "SELECT RESPONSE_DATE FROM TABLENAME";
my $sth = $dbh->prepare($query);
$sth->execute() or die "Couldn't execute statement: " . $sth->errstr;
my @results = $sth->fetchrow_array();
printf "response_date=%s",$results[0];
printf "localtime(time)=%s",localtime(time);
Вывод:
response_date=14-OCT-14 08.35.00.000000 PM
localtime(time)=Tue Aug 18 23:35:13 2015
Я могу получить все куски местного времени так:
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
Но теперь мне нужно сравнить эти фрагменты с аналогичными фрагментами response_date. Есть идеи?1 ответ:
Я предполагаю, что вам нужны все поля
localtime
для какого-то вычисления даты?
Time::Piece
модуль является обычным решением этой проблемы. Это позволяет вам анализировать время вашей базы данных, а также перегружаетlocaltime
, чтобы он возвращал объектTime::Piece
в скалярном контекстеК сожалению,
Time::Piece
не будет анализировать поле дробных секунд, поэтому, если оно не всегда равно нулю, вам нужно будет удалить его из строки даты-времениОчевидно, что другие вычисления возможны, как только у вас есть и значение базы данных, и текущая дата в виде объектов
Time::Piece
use strict; use warnings; use Time::Piece; use Time::Seconds 'ONE_DAY'; my $s = '14-OCT-14 08.35.00.000000 PM'; my $dt = Time::Piece->strptime($s, '%d-%b-%y %H.%M.%S.000000 %p'); my $now = localtime; printf "%s was %.3f days ago\n", $dt->strftime('%a %d-%b-%Y at %H:%M:%S'), ($now - $dt)->days;
Вывод
Tue 14-Oct-2014 at 20:35:00 was 308.190 days ago