
Mie Jun 25, 2008 3:32 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 3870
Ubicación: Valladolid, España
|
|
|
|
|
Según veo el código, lo que quieres es que $paso valga 1 si $res->{DFECHAABONO} es menor que la fecha inicial o sea mayor que la fecha final.
Es decir, $paso valdrá 1 si la fecha de abono es inferior al 1/1/1 o superior al 31/12/3000, con lo que suponemos que si las fechas de abonos son correctas, siempre debería valer 0. |
|
Mie Jun 25, 2008 3:35 pm
|
 |
Fegna
Perlero Nuevo

|
Registrado: 08 Ene 2008
Mensajes: 14
Ubicación: Santiago, Chile
|
|
|
|
|
| Así es, quiero imprimir sólo las que están en el rango escogido. |
|

Mie Jun 25, 2008 4:06 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 3870
Ubicación: Valladolid, España
|
|
|
|
|
Pues entonces, lo más seguro, es que tengas que invertir el sentido de las comparaciones.
| Perl: | #!/usr/bin/perl -s
use strict;
use warnings;
our $fdesde ||= '01/01/0001';
our $fhasta ||= '31/12/3000';
my @result = qw(
12/ 12/ 2008
23/ 06/ 2009
31/ 06/ 2010
01/ 01/ 0000
01/ 01/ 3001
);
foreach my $fecha ( @result ) {
print "Fecha: $fecha ";
my $paso = ( $fecha gt $fdesde and $fecha lt $fhasta ) ? 0 : 1;
if ( $paso == 0 ) {
print "Está dentro del rango\n";
}
else {
print "Está fuera del rango\n";
}
} |
| Código: |
Fecha: 12/12/2008 Está dentro del rango
Fecha: 23/06/2009 Está dentro del rango
Fecha: 31/06/2010 Está dentro del rango
Fecha: 01/01/0000 Está fuera del rango
Fecha: 01/01/3001 Está dentro del rango |
¡Oops! Tenemos un problema...
El uno de enero del 3001 debería estar fuera del rango, pero lo marca como que está dentro. ¿Por qué? Pues porque las comparaciones alfanuméricas se hacen de izquierda a derecha.
Perl comienza a comparar desde la izquierda, y allí ve '01/01/3001', que, desde luego, es superior al '01/01/0001'. Pero, en la parte derecha, tenemos que '01/01/' siempre va a ser inferior al '31/12/' del límite superior.
De hecho, cualquier fecha inferior al '31/12' SIEMPRE será inferior al límite superior.
Las comparaciones alfanuméricas no te sirven para lo que quieres.
Tienes varias soluciones, como por ejemplo usar alguno de los módulos gestores de fechas. O, más fácil, pasar todas tus fechas a un orden más 'lógico' para el ordenador: ir de las unidades más altas a las bajas, de izquierda a derecha:
| Perl: | #!/usr/bin/perl -s
use strict;
use warnings;
our $fdesde ||= '0001/01/01';
our $fhasta ||= '3000/12/31';
my @result = qw(
2008/ 12/ 12
2009/ 06/ 23
2010/ 06/ 31
0000/ 01/ 01
3001/ 01/ 01
);
foreach my $fecha ( @result ) {
print "Fecha: $fecha ";
my $paso = ( $fecha gt $fdesde and $fecha lt $fhasta ) ? 0 : 1;
if ( $paso == 0 ) {
print "Está dentro del rango\n";
}
else {
print "Está fuera del rango\n";
}
} |
| Código: |
Fecha: 2008/12/12 Está dentro del rango
Fecha: 2009/06/23 Está dentro del rango
Fecha: 2010/06/31 Está dentro del rango
Fecha: 0000/01/01 Está fuera del rango
Fecha: 3001/01/01 Está fuera del rango |
Ahora ya sale bien.
Recuerda: la ISO 8601 es tu amiga. |
|

Jue Jun 26, 2008 8:04 am
|
 |
Fegna
Perlero Nuevo

|
Registrado: 08 Ene 2008
Mensajes: 14
Ubicación: Santiago, Chile
|
|
|
|
|
| Gracias Explorer, desde hoy tengo una nueva amiga (la ISO 8601), tengo que cambiar el orden de la fecha, eso sí. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|