Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Una fecha entre un rango

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Mie Jun 25, 2008 3:18 pm
Fegna
Perlero Nuevo
Perlero Nuevo
Registrado: 08 Ene 2008
Mensajes: 14
Ubicación: Santiago, Chile
Una fecha entre un rango Responder citando

Hola,

Necesito filtrar una fecha según un rango especificado, pero, hasta el momento, no lo he logrado.

El código es:

Perl:

        if ( !$fdesde )
        {
                $fdesde = '01/01/0001';
        }
        if ( !$fhasta )
        {
                $fhasta = '31/12/3000';
        }

        foreach my $res (@result)
        {
                my $paso = 0;
                if ($res->{'DFECHAABONO'} lt $fdesde)
                {
                        $paso = 1;
                }
                if ($res->{'DFECHAABONO'} gt $fhasta)
                {
                        $paso = 1;
                }
                if ($paso eq 0)
                {
                # Puedo imprimir
                }
        }



El problema es que siempre me dice que $paso es igual a 0.

Si me pueden ayudar se los agradecería.
Mensaje Mie Jun 25, 2008 3:32 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 3915
Ubicación: Valladolid, España
Responder citando

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.
Mensaje Mie Jun 25, 2008 3:35 pm
Fegna
Perlero Nuevo
Perlero Nuevo
Registrado: 08 Ene 2008
Mensajes: 14
Ubicación: Santiago, Chile
Responder citando

Así es, quiero imprimir sólo las que están en el rango escogido.
Mensaje Mie Jun 25, 2008 4:06 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 3915
Ubicación: Valladolid, España
Responder citando

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.
Mensaje Jue Jun 26, 2008 8:04 am
Fegna
Perlero Nuevo
Perlero Nuevo
Registrado: 08 Ene 2008
Mensajes: 14
Ubicación: Santiago, Chile
Responder citando

Gracias Explorer, desde hoy tengo una nueva amiga (la ISO 8601), tengo que cambiar el orden de la fecha, eso sí.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group