Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Otros Temas » Bases de Datos » Intervalo de fechas Responder al tema
Nuevo tema


Página 1 de 1  [ 14 mensajes ] 
 
Nota 2008-10-20 09:00 @417

Perlero Nuevo
Registrado: 2008-09-19 09:35 @441
Mensajes: 33
Intervalo de fechas
Buenas. Estaba haciendo unas consultas en SQL y me trabé con una y no sé cómo hacerla. ¡¡Capaz que no es difícil pero no sé me ocurrió cómo hacerla!!

Lo que tengo que hacer es que me devuelva algo así...

Código:
Número de semana /  Bajas / Altas
1                      xx       xx
2                      xx       xx
3                      xx       xx
4                      xx       xx
5                      xx       xx


Syntax: [ Download ] [ Hide ]
Using sql Syntax Highlighting
FROM `usuario`


Las fechas es desde el 2008-06-01 (no se le pasa la fecha sino que se le agrega) hasta el día de hoy.

La columna baja la cuenta de fechaterm y las de alta, de fechareg.

Tienen formato: $year."/".$mon."/".$mday." ".$hour.":".$min.":".$sec.

¡No sé como hacer que en una tabla vaya poniendo el número de semana!

Cualquier cosa avisen, ¡¡saludos!!



¡¡¡EDITO!!!

Syntax: [ Download ] [ Hide ]
Using sql Syntax Highlighting
SELECT count(fechareg) AS Altas, count(fechaterm) AS baja FROM `usuario`
  WHERE fechareg >  (DATE_SUB('2008-06-01',INTERVAL 7 DAY) )
 OR fechaterm > ( DATE_SUB('2008-06-01',INTERVAL 7 DAY) );


Hice esto: hasta el momento me devuelve la cantidad de altas y bajas pero ¡¡no sé cómo hacer para que me devuelva por semana!! :(

¿¿Hay alguna forma de hacerlo o por código no más??

Saludos... Pablo


Nota 2008-10-20 09:32 @439
Avatar de Usuario
Creador de Perl en Español
Registrado: 2003-10-15 16:52 @744
Ubicación: México
Mensajes: 1163
Por la sintaxis me imagino que estás en MySQL. En ese caso puedes usar la función WEEK() que te da el número de semana de una fecha.

Para versión 5.0:
http://dev.mysql.com/doc/refman/5.0/en/ ... ction_week

Para versión 3 a 4:
http://dev.mysql.com/doc/refman/4.1/en/ ... ction_week

Saludos

_________________
Uriel Lizama Perl programmer fundador de Perl en Español


Nota 2008-10-20 09:49 @450

Perlero Nuevo
Registrado: 2008-09-19 09:35 @441
Mensajes: 33
Según entendí eso te devuelve el número de semana del año, pero lo que necesito es que cuente en donde dice "numero de semana" el primero sea la fecha 2008-06-01 de ahí cada 7 días va sumando uno y va contando de nuevo.

ejemplo:
Código:
del dia 2008-06-01 al 2008-06-08 hubieron 4 bajas 10 altas
del dia 2008-06-09 al 2008-06-16 hubieron 5 bajas 5 altas


pero vos ves un listado de los usuarios que tienen fechareg = (fecha que se reg) y fechaterm (null si no se dio de baja o una fecha si se dio de baja)
....

quedaría

Código:
semana - bajas - alta
1 - 4 - 10
2 - 5 - 5


lo que va en semana sería como un contador...

Saludos... (espero que se haya entendido)


Nota 2008-10-20 10:39 @485
Avatar de Usuario
Creador de Perl en Español
Registrado: 2003-10-15 16:52 @744
Ubicación: México
Mensajes: 1163
Ya entiendo, ¿podrías poner la estructura que tienes actualmente en tu tabla?

_________________
Uriel Lizama Perl programmer fundador de Perl en Español


Nota 2008-10-20 11:05 @503

Perlero Nuevo
Registrado: 2008-09-19 09:35 @441
Mensajes: 33
La tabla usuario tiene los datos de usuarios como id, nombre, usuario, email, etc.... Las que valen la pena ahí serían fechareg y fechaterm (el tipo de ambas es timestamp).

Con el código que puse arriba me devuelve solo

Código:
Altas / Bajas
xxx / xxx


(el total de altas y bajas que hay) pero me gustaría que por lo menos me diga

Código:
altas / bajas
xx / xx
xx / xx
xx / xx


cada 7 días. Humm, ese es el problema, ya que si por lo menos me devuelve eso el resto lo puedo hacer con código Perl.

No sé si necesitarás algún dato más.


Nota 2008-10-20 19:30 @854

Perlero Frecuente
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa
Mensajes: 132
Algo así (no tengo tiempo para buscar la sintaxis exacta en MYSQL) debería funcionar:

Syntax: [ Download ] [ Hide ]
Using sql Syntax Highlighting
SELECT A.Semana, A.Altas, B.Bajas
FROM (
 SELECT Convert( int, DateDiff( day, '2008-06-01', fechaterm)) AS Semana, count(*) AS Altas
 FROM `usuario`
 GROUP BY Convert( int, DateDiff( day, '2008-06-01', fechaterm))
) AS A
OUTER JOIN (
 SELECT Convert( int, DateDiff( day, '2008-06-01', fechareg)) AS Semana, count(*) AS Bajas
 FROM `usuario`
 GROUP BY Convert( int, DateDiff( day, '2008-06-01', fechareg))
) AS B ON A.Semana = B.Semana

_________________
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)


Nota 2008-10-21 06:39 @318

Perlero Nuevo
Registrado: 2008-09-19 09:35 @441
Mensajes: 33
Gracias, ahora veo cómo sería el convert en MySQL. Si alguien me tira una ayudita se lo agradecería :$

Acá está cómo sería pero no entendí mucho:
http://dev.mysql.com/doc/refman/5.0/en/ ... nvert.html

Probé:
Syntax: [ Download ] [ Hide ]
Using sql Syntax Highlighting
Convert( DateDiff( day, '2008-06-01', fechaterm) USING int)


y me tira error.

Saludos... Pablo


Nota 2008-10-21 07:06 @337
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10261
convert se refiere al cambio de conjuntos de caracteres. No tiene nada que ver con cambiar fechas a enteros.

Lo más parecido que quieres hacer es la función WEEK():
http://dev.mysql.com/doc/refman/5.0/en/ ... ction_week

_________________
JF^D Perl programming


Nota 2008-10-21 07:14 @343

Perlero Frecuente
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa
Mensajes: 132
http://dev.mysql.com/doc/refman/5.0/en/ ... tions.html

Y actualmente vas a tener que dividir el resultado de DateDiff() por 7. Yo olvidé añadir esto en el código.

Y parece que el DateDiff() en MySQL no soporta el parámetro que specifica si quieres saber cuántas horas/días/semanas/meses/años hay entre las dos fechas. http://dev.mysql.com/doc/refman/5.0/en/ ... n_datediff

_________________
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)


Última edición por Jenda el 2008-10-21 07:21 @347, editado 1 vez en total

Nota 2008-10-21 07:17 @345

Perlero Nuevo
Registrado: 2008-09-19 09:35 @441
Mensajes: 33
Gracias explorer, pero como dije antes no quiero que dada una fecha me devuelva el número de semana que corresponde al año.

Ahora estoy tratando de que simplemente la consulta me devuelva

Código:
altas / bajas
xx / xx
xx / xx
xx / xx


(cada renglón una semana distinta) sin número, ya que el resto lo puedo hacer con Perl. Estaba pensado hacer una llamada desde Perl entre fechas, pero no sé cómo a una fecha (2008-09-22) sumarle 7 días y que quede bien :D


Nota 2008-10-21 07:35 @358
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10261
No es muy complicado...

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

use DateTime;

my $fecha = DateTime->new(
    year    => 2008,
    month   => 9,
    day     => 22,
);

for (1..10) {
    print $fecha->ymd('-'), "\n";

    $fecha->add(days => 7);
}
Sale:
Código:
2008-09-22
2008-09-29
2008-10-06
2008-10-13
2008-10-20
2008-10-27
2008-11-03
2008-11-10
2008-11-17
2008-11-24

_________________
JF^D Perl programming


Nota 2008-10-21 09:38 @443

Perlero Nuevo
Registrado: 2008-09-19 09:35 @441
Mensajes: 33
Tengo la fecha de otra forma. Lo que hice fue (capaz que le sea útil a alguien en un futuro...)

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
        $year += 1900;
        $mon++;
        my $hoy = $year."/".$mon."/".$mday." ".$hour.":".$min.":".$sec;
       
        my $fechaInicio = 1212289200;
        my $suma = 7*24*60*60;
        my $fechaU = $fechaInicio;

        ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($fechaInicio);
        $year += 1900;
        $mon++;
        my $inicio = $year."/".$mon."/".$mday." ".$hour.":".$min.":".$sec;

        while ($fechaU <= time()) {

                 $fechaU += $suma;
                ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($fechaU);
                $year += 1900;
                $mon++;
                 $fin = $year."/".$mon."/".$mday." ".$hour.":".$min.":".$sec;

                 #comandos varios!

                $inicio = $fin;
         }


Un poco más rebuscado pero me sirve para lo que tengo que hacer...

Al final terminé haciendo con Perl lo que iba a hacer con SQL, jajajá

Gracias a todos por su ayuda.


Nota 2008-10-21 14:56 @664
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10261
La salida de
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
#!/usr/bin/perl -l
use strict;
use warnings;
use diagnostics;

my ($sec,$min,$hour,$mday,$mon,$year) = localtime;
$year += 1900;
$mon  ++;
my $hoy = "$year/$mon/$mday $hour:$min:$sec";

my $fechaInicio = 1212289200;
my $suma        = 7*24*60*60;

my $fechaU      = $fechaInicio;
($sec,$min,$hour,$mday,$mon,$year) = localtime($fechaInicio);
$year += 1900;
$mon  ++;

my $inicio = "$year/$mon/$mday $hour:$min:$sec";
print "Inicio: $inicio";

while ($fechaU <= time) {
    $fechaU += $suma;
    ($sec,$min,$hour,$mday,$mon,$year) = localtime($fechaU);
    $year += 1900;
    $mon  ++;

    my $fin = "$year/$mon/$mday $hour:$min:$sec";
    print "Fin: $fin";

    #comandos varios!

    $inicio = $fin;
}
es
Código:
Inicio: 2008/6/1 5:0:0
Fin: 2008/6/8 5:0:0
Fin: 2008/6/15 5:0:0
Fin: 2008/6/22 5:0:0
Fin: 2008/6/29 5:0:0
Fin: 2008/7/6 5:0:0
Fin: 2008/7/13 5:0:0
Fin: 2008/7/20 5:0:0
Fin: 2008/7/27 5:0:0
Fin: 2008/8/3 5:0:0
Fin: 2008/8/10 5:0:0
Fin: 2008/8/17 5:0:0
Fin: 2008/8/24 5:0:0
Fin: 2008/8/31 5:0:0
Fin: 2008/9/7 5:0:0
Fin: 2008/9/14 5:0:0
Fin: 2008/9/21 5:0:0
Fin: 2008/9/28 5:0:0
Fin: 2008/10/5 5:0:0
Fin: 2008/10/12 5:0:0
Fin: 2008/10/19 5:0:0
Fin: 2008/10/26 4:0:0
Humm... es un poco más fea... :)

En cuestión de control de tiempos y fechas, siempre es recomendable usar DateTime.

Otra forma es usar strftime() del módulo POSIX (que sí viene incluido de base) que nos puede ayudar a formatear la salida:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
#!/usr/bin/perl -l
use strict;
use warnings;
use diagnostics;

use POSIX qw(strftime);

my $hoy = strftime '%F %T', localtime;
print "Hoy:    $hoy";

my $fechaInicio = 1212289200;
my $suma        = 7*24*60*60;
my $fechaU      = $fechaInicio;

my $inicio = strftime '%F %T', localtime $fechaInicio;
print "Inicio: $inicio";

while ($fechaU <= time) {
    $fechaU += $suma;
    my $fin = strftime '%F %T', localtime $fechaU;

    print "Fin:    $fin";

    #comandos varios!

    $inicio = $fin;
}
Sale:
Código:
Hoy:    2008-10-21 21:46:59
Inicio: 2008-06-01 05:00:00
Fin:    2008-06-08 05:00:00
Fin:    2008-06-15 05:00:00
Fin:    2008-06-22 05:00:00
Fin:    2008-06-29 05:00:00
Fin:    2008-07-06 05:00:00
Fin:    2008-07-13 05:00:00
Fin:    2008-07-20 05:00:00
Fin:    2008-07-27 05:00:00
Fin:    2008-08-03 05:00:00
Fin:    2008-08-10 05:00:00
Fin:    2008-08-17 05:00:00
Fin:    2008-08-24 05:00:00
Fin:    2008-08-31 05:00:00
Fin:    2008-09-07 05:00:00
Fin:    2008-09-14 05:00:00
Fin:    2008-09-21 05:00:00
Fin:    2008-09-28 05:00:00
Fin:    2008-10-05 05:00:00
Fin:    2008-10-12 05:00:00
Fin:    2008-10-19 05:00:00
Fin:    2008-10-26 04:00:00
A propósito... el día 26 marca una hora menos porque, justamente ese día, se produce el cambio de hora de invierno aquí en España.

_________________
JF^D Perl programming


Nota 2008-10-22 06:30 @312

Perlero Nuevo
Registrado: 2008-09-19 09:35 @441
Mensajes: 33
Gracias, lo mismo lo uso para hacer consultas en una DB ¡y ahí no influye! Lo mismo es muy bueno para tener en cuenta, ¡¡además queda un poco más lindo el código!!

Saludos...


Responder al tema  [ 14 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO