2014-12-23 2 views
-1

Я думаю, что это очень простой вопрос. Но я пробовал разные способы и не мог понять это.Perl сравнить дату, которая определена как строка в базе данных

У меня есть строковое значение «21-01-2014». Я должен проверить, больше ли эта дата, чем 1 сентября 2014 года.

Как это сделать?

Я использовал дату синтаксического анализа. Например.

if (ParseDate($row->{Date}) >= ParseDate("01-09-2014")){ 
} 

Но это не сработало. Может быть, здесь есть ошибка?

Может кто-то предложить более простой и понятный подход. $ row-> Дата исходит из базы данных и определяется как varchar.

Спасибо.

+0

Откуда вы получаете функцию 'ParseDate'? Определяется ли это в стороннем модуле или в вашем собственном коде? – ThisSuitIsBlackNot

+0

Предполагая, что мы говорим о [Time :: ParseDate] (http://search.cpan.org/~muir/Time-modules-2003.0211/lib/Time/ParseDate.pm), я хочу отметить, что он анализирует даты как 'DD/MM/YYYY' **", только если Великобритания, или недействительный mm/dd/yyyy "**. Возможно, он читает вторую дату 9 января, в американском стиле. –

+2

Двадцать первый день января 2014 года приходит перед первым днем ​​сентября того же года. Таким образом, ваше условие 'if' _should_ терпит неудачу. –

ответ

2

Где находится ParseDate? Это Time::ParseDate?

Я предпочитаю Time::Piece. . Это был стандартный модуль Perl, так как 5.10, и я могу указать формат, что дата в плюс, Time::Piece является объектно-ориентированным:

use strict;    # Lets you know when you misspell variable names 
use warnings;   # Warns of issues (using undefined variables 
use feature qw(say); 

use Time::Piece; 

my $time1 = "21-01-2014"; 
my $time2 = "01-09-2014"; #Assuming this is Sept, 1, 2014 

my $time_obj1 = Time::Piece->strptime("$time1", "%d-%m-%Y"); 
my $time_obj2 = Time::Piece->strptime("$time2", "%d-%m-%Y"); 

if ($time_obj1 < $time_obj2) { # Comparing number of days since "the epoc" 
    say $time_obj1->dmy . " is older than " . $time_obj2->dmy; 
} 
else { 
    say $time_obj2->dmy . " is older than " . $time_obj1->dmy; 
} 

Если вы не хотите создавать объекты, вы можете просто использовать значения, возвращаемые Time::Piece->strptime:

if (Time::Piece->strptime("$time1", "%d-%m-%Y") 
     < Time::Piece->strptime("$time2", "%d-%m-%Y")) { 
    say "$time1 is older than $time2"; 
} 
else { 
    say "$time2 is older than $time1"; 
} 

строка %d-%m-%Y формат вашей даты. (И вы должны проверить возвращаемое значение Time::Piece->strptime, чтобы убедиться, что у вас есть действительный объект Time::Piece. Я не делал этого здесь для простоты).

Вы можете найти коды в формате процента для дат либо в странице Справочника date или на странице Справочника strftime.

+0

W, он работал как ожидалось. Я думаю, что это лучший и самый простой способ. – Mahesh