преобразование даты 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 2

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