kontrola datumu
Milos Dvorak
milos na rosice.cz
Čtvrtek Červenec 3 08:36:21 CEST 2003
> Date: Wed, 2 Jul 2003 18:11:38 +0200
> From: Petr Vileta <petr na practisoft.cz>
>
> Ve webovem formulari nekdo vyplni datum. Protoze to je textove pole,
> je nutne to napred zkontrolovat zda je tam den, mesic a rok (na 4
> cislice), ale potom je treba jeste zkontrolovat, zda takove datum je
> vybec platne (prestupne roky, 31 dubna a podobne nesmysly). Tak jsem
> udelal tenhle select (psano v perlu)
> (...)
> $sth=$dbh->prepare("select ifnull(truncate(date_sub(DATE_ADD($datum,
> INTERVAL 1 day), interval 1 day)/1000000,0)=$datum,0)");
Mne ten select v mysql 3.23.56 vraci 0 vzdy. Neni mi jasny duvod pouziti
truncate. Co mi ale funguje, je:
mysql> select if(date_sub(date_add('2003-12-31', interval 1 day),
-> interval 1 day) = '2003-12-31', 1, 0) Platne;
Platne: 1
mysql> select if(date_sub(date_add('2003-02-29', interval 1 day),
-> interval 1 day) = '2003-02-29', 1, 0) Platne;
Platne: 0
Proc to nechcete udelat primo v tom Perlu?
#!/usr/bin/perl -w
use strict;
use POSIX;
sub JePlatneDatum {
my ($rok, $mesic, $den) = split (/-/, $_);
return ($_ eq strftime("%Y-%m-%d", 0, 0, 0, $den, $mesic-1,
$rok-1900) ? 1 : 0);
}
foreach ("2003-12-31", "2003-02-29") {
print "Datum $_ ", JePlatneDatum($_) ? "je" : "není", " platne\n";
}
[milos perl]$ ./datum.pl
Datum 2003-12-31 je platne
Datum 2003-02-29 není platne
Další informace o konferenci Databases