Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: cchianalino en 25 Septiembre 2018, 17:31 pm



Título: Rango de fechas a partir del dia de la semana mysql
Publicado por: cchianalino en 25 Septiembre 2018, 17:31 pm
Hola a todos es mi primer tema en el foro, voy a intentar ser lo mas claro posible para ver si alguien puede ayudarme.
tengo en mi db un campo fecha y necesito filtrar los registros de esa tabla en un rango semanal que va de jueves a jueves.

SELECT* FROM datos WHERE fecha BETWEEN (jueves pasado) AND (jueves proximo)

Con el agregado que si el dia de hoy es jueves debe tomar desde "hoy" hasta el jueves proximo.

Desde ya muchas gracias !!!!


Título: Re: Rango de fechas a partir del dia de la semana mysql
Publicado por: EdePC en 25 Septiembre 2018, 23:23 pm
Saludos,

- Mmm, la documentación de MySQL actualizado está incompleta o no le encuentro las sentencias de LOOP  :xD

- Intenta las siguientes funciones:

Código
  1. DELIMITER //
  2. DROP FUNCTION IF EXISTS juevesPasado;
  3. CREATE FUNCTION juevesPasado() RETURNS DATE
  4. BEGIN
  5.  DECLARE fecha DATE DEFAULT CURRENT_DATE();
  6.  WHILE DAYNAME(fecha) <> 'Thursday' DO
  7.    SET fecha = DATE_SUB(fecha, INTERVAL 1 DAY);
  8.  END WHILE;
  9.  RETURN fecha;
  10. END //
  11. DELIMITER ;
  12.  
  13. DELIMITER //
  14. DROP FUNCTION IF EXISTS juevesProximo;
  15. CREATE FUNCTION juevesProximo() RETURNS DATE
  16. BEGIN
  17.  DECLARE fecha DATE DEFAULT CURRENT_DATE();
  18.  WHILE DAYNAME(fecha) <> 'Thursday' DO
  19.    SET fecha = DATE_ADD(fecha, INTERVAL 1 DAY);
  20.  END WHILE;
  21.  RETURN fecha;
  22. END //
  23. DELIMITER ;
  24.  
  25. SELECT * FROM datos WHERE fecha BETWEEN juevesPasado() AND juevesProximo();

-- Lo he probado en una base de datos que tengo y funciona XD, me ha dado problema los condenados DELIMITER, he aprendido algo más sobre MySQL ya que yo trabajo más con SQL Server.

- Te recomiendo tener a mano el Manual de referencia de MySQL 5, no será la última (MySQL 8) pero está en perfecto español:

https://downloads.mysql.com/docs/refman-5.0-es.pdf


Título: Re: Rango de fechas a partir del dia de la semana mysql
Publicado por: cchianalino en 26 Septiembre 2018, 14:19 pm
Hola EdePC, muchisimas gracias ahora lo pruebo y te comento, tambien estoy por probar el siguiente codigo que me ayudaron desde otro foro.

-------------------------------------------------------
Puedes usar la función 'CURRENT_DATE()' o 'CURDATE()'; también puedes usar la constante, 'CURRENT_DATE',para conseguir la fecha actual. Puedes usar 'DAYOFWEEK()' para conseguir el día de la semana de la fecha actual como un número, donde 1 representa Domingo y obviamente 7 representaría Sábado. Como Jueves es 5, podemos calcular cuántos días tenemos que restar a la fecha actual para conseguir la fecha del jueves de la semana pasada: -7 + 5 - día. Asimismo, calculamos la fecha del jueves de la siguiente semana: 7 + 5 - día.
------------------------------------------------------
Como decia ahora pruebo ambas y te comento como me fue, gracias !!!!!!


Título: Re: Rango de fechas a partir del dia de la semana mysql
Publicado por: EdePC en 26 Septiembre 2018, 15:14 pm
- Pues me alegra saber que mi código incluye la ayuda que te han comentado e incluso hago mejor uso de la identificación del nombre del día (Thursday = Jueves) y una mejor suma/resta de un día  :laugh:


Título: Re: Rango de fechas a partir del dia de la semana mysql
Publicado por: cchianalino en 27 Septiembre 2018, 06:45 am
Hola EdePCal final no he podido lograr hacerlo desde mysql (si tome la logica que planteaste y lo realice desde php)

Todos los ";" (salvo del del DELIMITER) me daban error - "caracter inesperado"
Al quitarlos, CREATE me da el siguiente mensaje de error - "se econtro una nueva declaracion, pero no hay delimitado entre este y el anterior."

AL incorporar un DELIMITER para separar DROP de CREATE  y ejecutar la consulta
"#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHILE DAYNAME(fecha) <> 'Thursday' DO
    SET fecha = DATE_SUB(fecha, INTERVAL ' at line 4"

Probe borrando DROP y el error 1064 se repite.

voy a leer más en el manual porque esta claro que algo se me escapa.

-----------------------------------------------------------------------------
PHP
$juevesPasado = date('Y-m-d');
        $dia_fecha = date('l');
        while ($dia_fecha != 'Thursday') {
            //si hoy no es jueves le resto un día a la fecha
            $juevesPasado = strtotime('-1 day', strtotime($juevesPasado));
            $juevesPasado = date('Y-m-d', $juevesPasado);
            //resto un día al dia de la semana
            $dia_fecha = strtotime('-1 day', strtotime($juevesPasado));
            $dia_fecha = date('l', $juevesPasado);
        }
       
        $juevesProximo = date('Y-m-d');
        $dia_fecha_futuro = date('l');
        while ($dia_fecha_futuro != 'Thursday') {
            //si hoy no es jueves le sumo un día a la fecha
            $juevesProximo = strtotime('+1 day', strtotime($juevesProximo));
            $juevesProximo = date('Y-m-d', $juevesProximo);
            //sumo un día al dia de la semana
            $dia_fecha_futuro = strtotime('+1 day', strtotime($juevesProximo));
            $dia_fecha_futuro = date('l', $juevesProximo);
        }
        //si hoy es jueves - $juevesPasado = hoy y $juevesProximo = hoy + 7 dias
        if ($dia_fecha == 'Thursday') {
            $juevesPasado = date('Y-m-d');
            $juevesProximo = strtotime('+7 day', strtotime($juevesProximo));
            $juevesProximo = date('Y-m-d', $juevesProximo);
        }
//consulta mysql
$vencimiento_semanal = "SELECT SUM(MONTO) AS vencimiento_semana FROM cheques WHERE FECHA_COBRO BETWEEN '$juevesPasado' AND '$juevesProximo' AND ID_ESTADO = 1 AND ID_TIPO = 1";

fin PHP -------------------------------------------------------
Muchas gracias por la ayuda voy intentar dar con la solucion, me interesa también saber hacerlo desde mysql.