Portál AbcLinuxu, 10. května 2025 11:19

Dotaz: porovnání datumů

28.5.2007 10:49 yorik
porovnání datumů
Přečteno: 552×
Odpovědět | Admin
Ahoj, potřeboval bych scriptík, který dostane 2 časy a datum a pakliže ten druhý čas je menší než první, tak vrátí datum +1d. Awk bohužel s datumy a časy zacházet neumí, tak jsem se pokusil podle nápověd a diskuzí něco stvořit v perlu (který neumím), ale nedaří se mi ani zadat datum.

perl -e '@cas = localtime(?);‘

Prosím o radu, alespoň co místo otazníku( „YYYY-MM-DD“ - nefunguje). Případně i další rady uvítám. Předem velice děkuji. Jirka
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

28.5.2007 10:56 stak | skóre: 4
Rozbalit Rozbalit vše Re: porovnání datumů
Odpovědět | | Sbalit | Link | Blokovat | Admin
To datum bude vždycky stejné, nebo se bude lišit?

DN
28.5.2007 11:05 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: porovnání datumů
Odpovědět | | Sbalit | Link | Blokovat | Admin
elegantnejšie riešenie (v perl-i):
use Class::Date;

my $time1 = Class::Date::date ('2007-05-28 00:00:00');
my $time2 = Class::Date::date ('2007-05-28 24:00:00');

$time1 += '1D'
  if $time1 < $time2;

# my $now = Class::Date::now;
# my $now2 = Class::Date::date (time);
# my $now3 = Class::Date::date (`date +%s`);
pre viac info by to chcelo viac popisu problému.
28.5.2007 11:09 stak | skóre: 4
Rozbalit Rozbalit vše Re: porovnání datumů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Je asi hodně způsobů, já bych to řešil takto.

use strict; use warnings; use Date::Simple; use Time::Simple;

my ( $cas1, $cas2, $datum ) = ( $ARGV[0], $ARGV[1], $ARGV[2] );

my $ocas1 = Time::Simple->new($cas1);

if ( $ocas1 < $cas2 ) { my $odatum = Date::Simple->new($datum); $odatum = $odatum->next; print "$odatum\n"; }
28.5.2007 12:16 yorik
Rozbalit Rozbalit vše Re: porovnání datumů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Napsal jsem ty scripty do souboru a spouštím to jako „perl názevsouboru“, ale bohužel to nechodí. Hlásí to:

1 script:

syntax error in file pokus.perl at line 1, next 2 tokens "use Class" Execution of pokus.perl aborted due to compilation errors.

2 script:

syntax error in file pokus1.perl at line 1, next 2 tokens "use strict" syntax error in file pokus1.perl at line 7, next 2 tokens "my $odatum " syntax error in file pokus1.perl at line 7, next 2 tokens "->" Execution of pokus1.perl aborted due to compilation errors.

Prosím o radu, co dělám špatně. Předem velice děkuji.

Podrobnější popis problému: V jedné databázi jsou uloženy časy a jedno datum ( např. datum, čas1, čas2) a já je potřebuji přenést do jiné databáze, kde je ale uloženo datum1, čas1, datum2, čas2. Z té první databáze tedy selectem zjistím hodnoty a pomocí awk vytvářím sql dotaz, který zazálohuje původní řádky a udělá update na nové hodnoty. Ale protože nemám v první databázi datum2, potřebuji ho zjistit - proto to porovnání časů. Tak jsem chtěl z AWK zavolat script, který mi ho na základě časů „dopočítá“ (příčte 1D, jestliže čas1 > čas2).
28.5.2007 12:27 stak | skóre: 4
Rozbalit Rozbalit vše Re: porovnání datumů
Problém bude asi v tom:

Pokuď pouštím skript v Linuxu je nutno jako první řádek definovat interpret, který mi zpracuje daný skript.

#!/usr/bin/perl -w

Popřípadě změnit cestu.

Dále bude potřeba stáhnout a doinstalovat moduly z http://www.cpan.org

http://search.cpan.org/CPAN/authors/id/Y/YV/YVES/Date-Simple-3.02.tar.gz http://search.cpan.org/CPAN/authors/id/L/LG/LGODDARD/Time-Simple-0.052.tar.gz

Mělo by stačit stáhnout, rozbalit, přesunout se do daného adresáře a napsat:

perl makefile.pl make make install

Nakonec spustit skript s argumenty:

test.pl "08:00:00" "09:00:00" "2007-05-25"

Mělo by to fungovat.

Obdobné řešení bude i u první varianty, akorát se stáhne jiný modul.

DN
28.5.2007 13:34 yorik
Rozbalit Rozbalit vše Re: porovnání datumů
Jo, dík, už to hází jinou a logičtější hlášku. Nemůže najít Simple.pm - problém je, že na tenhle server se nic nainstalovat nedá - je klíčový a dokud funguje, tak ho nikdo "dráždit" nebude.
28.5.2007 14:35 stak | skóre: 4
Rozbalit Rozbalit vše Re: porovnání datumů
No instalovat by se ani nic nemuselo, stačí se podívat, kde to hledá ten modul a pak tam uložit jenom soubor simple.pm.

DN
28.5.2007 15:05 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: porovnání datumů
export PERL5LIB=/home/user/lib/perl5/
28.5.2007 13:18 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: porovnání datumů
hmm, tie chyby sa mi nezdajú, nepozná "use strict" ???

k problému: aritmetiku nechať na databázu: (hint)

select datum, cas1, cas2, datum+1D, datum || cas1, datum || cas2;
posledné dva stĺpce by mali generovať dátum a čas ako jeden reťazec, reťazcovo provnávateľný (iso formát). A potom v podmienke vybrať buď datum alebo datum+1D
28.5.2007 13:31 yorik
Rozbalit Rozbalit vše Re: porovnání datumů
Jo, taky mě už napadlo nechat si to datum vypsat selectem, ale přece jenom vypočítat se mi ho zdálo lepší ... a taky jsem se mohl něco přiučit. Ale i tohle je varianta a možná na ní bohužel i dojde.
28.5.2007 14:18 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: porovnání datumů
aritmetika času je trochu náročnejšia :-)
iný variant je prekonvertovať čas na epoch, potom +1D je +86400 :-)
28.5.2007 13:04 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: porovnání datumů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jsem řešil něco podobného při vytváření souboru aby když konec hodin bude menší tj zasahuje do druhého dne se přičetl den aby konec seděl.

Viz:
fprintf(fw,"BEGIN:VCALENDAR\r\n");
fprintf(fw,"VERSION:2.0\r\n");
fprintf(fw, "BEGIN:VEVENT\r\n");
fprintf(fw, "SUMMARY:%s\r\n", linka);
//fprintf(fw, "DESCRIPTION:%s\r\n", linka);
fprintf(fw, "CATEGORIES:Prace\r\n");
fprintf(fw, "DTSTART:%04d%02d%02dT%02d%02d00\r\n", rok, mesic, den, zacatek_hodiny, zacatek_minuty);
if( zacatek_hodiny < konec_hodiny) fprintf(fw, "DTEND:%04d%02d%02dT%02d%02d00\r\n", rok, mesic, den, konec_hodiny, konec_minuty);
else fprintf(fw, "DTEND:%04d%02d%02dT%02d%02d00\r\n", rok, mesic, den+1, konec_hodiny, konec_minuty);
fprintf(fw, "AALARM:%04d%02d%02dT%02d%02d00\r\n", rok, mesic, den, zacatek_hodiny-1, zacatek_minuty);
fprintf(fw, "END:VEVENT\r\n");
fprintf(fw,"END:VCALENDAR\r\n");
28.5.2007 13:14 yorik
Rozbalit Rozbalit vše Re: porovnání datumů
Nezkoušel jsem to, ale mám dotaz, co to udělá např. 31.12. když přičteš den? „Přechroustá“ si to přechody měsíců samo? Dík Jirka
28.5.2007 13:35 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: porovnání datumů
Ha to mě nenapadlo grrrr to je vyjímečná situace.

U těch mých dat je pouze jedna položka co přechází přes půlnoc a ještě se opakuje jednou za 48 dní takže to mě uteklo.

Už to půjdu opravit. Díky za nakopnutí.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.