• Publicidad

Una fecha entre un rango

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Una fecha entre un rango

Notapor Fegna » 2008-06-25 16:18 @721

Hola,

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

El código es:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
        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
                }
        }

 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


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

Si me pueden ayudar se los agradecería.
Fegna
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2008-01-08 09:29 @437
Ubicación: Santiago, Chile

Publicidad

Notapor explorer » 2008-06-25 16:32 @730

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Fegna » 2008-06-25 16:35 @732

Así es, quiero imprimir sólo las que están en el rango escogido.
Fegna
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2008-01-08 09:29 @437
Ubicación: Santiago, Chile

Notapor explorer » 2008-06-25 17:06 @754

Pues entonces, lo más seguro, es que tengas que invertir el sentido de las comparaciones.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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";
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Código: Seleccionar todo
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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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";
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Código: Seleccionar todo
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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Fegna » 2008-06-26 09:04 @419

Gracias Explorer, desde hoy tengo una nueva amiga (la ISO 8601), tengo que cambiar el orden de la fecha, eso sí.
Fegna
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2008-01-08 09:29 @437
Ubicación: Santiago, Chile


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 24 invitados