Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] dias entre fechas

Estas en el tema de dias entre fechas en el foro de PHP en Foros del Web. Buenas tardes, alguien me podria ayudar. Tengo una fecha ya establecida en mi base de datos la cual es el campo fechaaprob y se la ...
  #1 (permalink)  
Antiguo 05/02/2016, 15:43
 
Fecha de Ingreso: junio-2015
Mensajes: 63
Antigüedad: 8 años, 10 meses
Puntos: 0
dias entre fechas

Buenas tardes, alguien me podria ayudar.

Tengo una fecha ya establecida en mi base de datos la cual es el campo fechaaprob y se la quiero resta a la fecha actual para que me diga la diferencia de dias entre una fecha y otra. Ya lo tengo de esta forma pero ahora la pregunta es como le quito los dias no laborales

Este es mi codigo


SELECT TIMESTAMPDIFF(DAY, fechaaprob, CURDATE())AS fehcavalrt
FROM tabla



alguien me podria ayudar

Última edición por isisunicornio; 05/02/2016 a las 16:07
  #2 (permalink)  
Antiguo 05/02/2016, 16:43
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: dias entre fechas

¿Estoy imaginando cosas o eso es código SQL y no código PHP?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 06/02/2016, 03:30
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: dias entre fechas

Hola isisunicornio,

Para contrarrestar la "dureza" de pateketrueke (sin ánimo ofender), vamos a facilitar las cosas al máximo, pero estudia la función para que la entiendas y sepas lo que hace:

Código PHP:
Ver original
  1. //$fecha_inicio = "2015-09-01"; // En formato aaaa-mm-dd
  2. //$fecha_fin = "2016-06-30"; // En formato aaaa-mm-dd
  3.  
  4. $fecha_inicio = "01-09-2015"; // En formato dd-mm-aaaa
  5. $fecha_fin = "30-06-2016"; // En formato dd-mm-aaaa
  6.  
  7.  
  8. //Array de festivos a tener en cuenta sin contar sábados ni domingos
  9. //Este array puede ser obtenido de una base de datos o completado a mano como aquí
  10.  
  11. $festivos = array(
  12.     //Completar con los días festivos del período, sin contar sábados ni domingos
  13.     '12-10-2015',  //  Día de la Virgen del Pilar o día de la Hispanidad
  14.     '01-11-2015',  //  Día de Todos los Santos (festivo religioso)
  15.     '02-11-2015',  //  Día de Todos los Santos (cambiado del domingo) (festivo religioso)
  16.     '07-12-2015',  //  Día de la Constitución (pasado del domingo)
  17.     '08-12-2015',  //  Inmaculada Concepción de la Virgen (festivo religioso)
  18.     '24-12-2015',  //  Vacaciones de navidad
  19.     '25-12-2015',  //  Natividad del Señor (festivo religioso) (irrenunciable)
  20.     '28-12-2015',  //  Vacaciones de navidad
  21.     '29-12-2015',  //  Vacaciones de navidad
  22.     '30-12-2015',  //  Vacaciones de navidad
  23.     '31-12-2015',  //  Vacaciones de navidad
  24.     '01-01-2016',  //  Año Nuevo (irrenunciable)
  25.     '04-01-2016',  //  Vacaciones de navidad
  26.     '05-01-2016',  //  Vacaciones de navidad
  27.     '06-01-2016',  //  Día de Reyes (irrenunciable)
  28.     '07-01-2016',  //  Vacaciones de navidad
  29.     '08-01-2016',  //  Vacaciones de navidad
  30.     '29-01-2016',  //  San Valero (festivo en Zaragoza capital)
  31.     '04-03-2016',  //  Cincomarzada (pasada del sábado)
  32.     '24-03-2016',  //  Jueves Santo (irrenunciable)
  33.     '25-03-2016',  //  Viernes Santo (irrenunciable)
  34.     '28-03-2016',  //  Vacaciones Semana Santa
  35.     '29-03-2016',  //  Vacaciones Semana Santa
  36.     '30-03-2016',  //  Vacaciones Semana Santa
  37.     '31-03-2016',  //  Vacaciones Semana Santa
  38.     '01-04-2016',  //  Vacaciones Semana Santa
  39.     '22-04-2016',  //  Día de San Jorge (pasado del sábado)
  40.     '02-05-2016'  //  Día del trabajador (pasado del domingo)
  41. );
  42.  
  43. //Esta función devuelve los días laborables entre dos fechas pasadas como parámetros
  44. //siendo el tercer parámetro un array con las fechas de los días festivos a tener en
  45. //cuenta para los fines en que se va a utilizar la función
  46.  
  47. function diasLaborables($fecha_inicio, $fecha_fin, $festivos) {
  48.          //El tercer parámetro que recibe esta función está tratado como un array, por lo que debe serlo
  49.          $fecha_comienzo = new DateTime( $fecha_inicio );    //inicia
  50.          $fecha_finalizacion = new DateTime( $fecha_fin );    //termina
  51.          
  52.          $intervalo = new DateInterval('P1D');    // intervalo de un día
  53.  
  54.          $rango = new DatePeriod($fecha_comienzo, $intervalo ,$fecha_finalizacion); //creamos rango de fechas
  55.          
  56.          $dias_laborables = array();
  57.                   foreach($rango as $date){
  58.                       //Se considera el fin de semana y los festivos como no hábiles
  59.                       if($date->format("N") <6 AND !in_array($date->format("d-m-Y"),$festivos))
  60.                           //$dias_laborables[] = $date->format("Y-m-d"); // se asignan fechas validas, devueltas en formato aaaa-mm-dd
  61.                           $dias_laborables[] = $date->format("d-m-Y"); // se asignan fechas validas, devueltas en formato dd-mm-aaaa
  62.                   }
  63.          return count($dias_laborables);
  64. }
  65.  
  66. //uso: echo diasLaborables($fecha_inicio, $fecha_fin, $festivos);
  67. //Devuelve un número que son los días laborables entre las dos fechas dadas

La base para esta función la obtuve de Internet, creo que de estos mismos foros, pero como realmente no recuerdo de donde, no puedo poner los créditos correspondientes, si alguien lo sabe y lo añade, sería perfecto.

En este caso los festivos están colocados según el calendario escolar de Zaragoza (España), de forma que calcula el total de días que trabajan los maestros (en el colegio) en esta ciudad, pero, como está especificado ahí, las fechas de los festivos, se pueden colocar a mano o extraer de una BBDD en función de la necesidad para la que se aplica la función.

Espero que te sirva.

Última edición por rbczgz; 06/02/2016 a las 04:18
  #4 (permalink)  
Antiguo 06/02/2016, 12:21
 
Fecha de Ingreso: diciembre-2015
Mensajes: 529
Antigüedad: 8 años, 4 meses
Puntos: 39
Respuesta: dias entre fechas

Hola rbczgz, tu función está muy muy bien, sin embargo creo que si se refiere a 'días no laborales' incluye los días de descanso, así que tendríamos que adaptar la función para incluir dichos días, pero bueno, primero que nos diga si eso busca también. Saludos :D
  #5 (permalink)  
Antiguo 06/02/2016, 19:21
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: dias entre fechas

Cita:
La base para esta función la obtuve de Internet, creo que de estos mismos foros, pero como realmente no recuerdo de donde, no puedo poner los créditos correspondientes, si alguien lo sabe y lo añade, sería perfecto.
El post original donde se soluciono un problema similar: http://www.forosdelweb.com/f18/calcu...emana-1144175/
Cita:
Hola rbczgz, tu función está muy muy bien, sin embargo creo que si se refiere a 'días no laborales' incluye los días de descanso, así que tendríamos que adaptar la función para incluir dichos días, pero bueno, primero que nos diga si eso busca también. Saludos :D
El calculo contempla el sabado y domingo como dias de descanso, si se requiere solo los domingos solo se cambian la condición a
Código PHP:
Ver original
  1. if($date->format("N") <7 AND !in_array($date->format("d-m-Y"),$festivos))
Con cambios mínimos puede ser un parámetro de la función
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #6 (permalink)  
Antiguo 08/02/2016, 12:21
 
Fecha de Ingreso: junio-2015
Mensajes: 63
Antigüedad: 8 años, 10 meses
Puntos: 0
Respuesta: dias entre fechas

Hola chicos, muchas gracias a todos por responder, en realidad lo unico que quiero quitarle a los dias es sabado y domingo, perdonen mi ignorancia, pero les agradezco a todos su ayuda,

Ya trate de modificar mi codigo pero no me hace la función como ustedes me lo ponen siempre que tomo una fecha me pone que son 46 dias


ahorita el la sentencia que les puse actualmente tengo en el campo fechaaprob tengo el 4 de febrero, al dia de hoy son cuatro dias de retraso,

hay alguna forma que en la sentencia SELECT TIMESTAMPDIFF(DAY, fechaaprob, CURDATE())AS fehcavalrt
FROM tabla

le quite los sabados y domingo
  #7 (permalink)  
Antiguo 08/02/2016, 12:42
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: dias entre fechas

Mi estimado, si tu pregunta esta orientada a SQL, por favor realiza la pregunta en el foro correspondiente
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #8 (permalink)  
Antiguo 08/02/2016, 14:02
 
Fecha de Ingreso: junio-2015
Mensajes: 63
Antigüedad: 8 años, 10 meses
Puntos: 0
Respuesta: dias entre fechas

Muchas gracias, me cambio de foro entonces, saludos
  #9 (permalink)  
Antiguo 08/02/2016, 17:12
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: dias entre fechas

Cita:
Iniciado por hhs Ver Mensaje
El post original donde se soluciono un problema similar: http://www.forosdelweb.com/f18/calcu...emana-1144175/
Gracias hhs por localizar el tema, así puedo poner los créditos a quien le corresponden

Hola isiunicornio,

Por si al final decides hacerlo mediante PHP te dejo la función modificada para lo que quieres:

Código PHP:
Ver original
  1. $query = "SELECT fechaaprob FROM tabla";
  2. $consulta = mysql_query($query);
  3.  
  4. while ($fila = mysql_fetch_assoc($consulta)) {
  5.     $fecha = $fila['fechaaprob'];
  6. }
  7.  
  8. $fecha = explode(" ", $fecha);
  9. $fecha = $fecha[0];
  10.  
  11.     $fecha_inicio = $fecha; // En formato aaaa-mm-dd que es como viene de la BD
  12.     $fecha_fin = date('Y-m-d'); // En formato aaaa-mm-dd que es como viene de la BD
  13.      
  14.     //Esta función devuelve los días laborables entre dos fechas pasadas como parámetros
  15.      
  16.     function diasLaborables($fecha_inicio, $fecha_fin) {
  17.              //El tercer parámetro que recibe esta función está tratado como un array, por lo que debe serlo
  18.              $fecha_comienzo = new DateTime( $fecha_inicio );    //inicia
  19.              $fecha_finalizacion = new DateTime( $fecha_fin );    //termina
  20.              
  21.              $intervalo = new DateInterval('P1D');    // intervalo de un día
  22.      
  23.              $rango = new DatePeriod($fecha_comienzo, $intervalo ,$fecha_finalizacion); //creamos rango de fechas
  24.              
  25.              $dias_laborables = array();
  26.                       foreach($rango as $date){
  27.                           //Se considera el fin de semana y los festivos como no hábiles
  28.                           if($date->format("N") <6)
  29.                               $dias_laborables[] = $date->format("Y-m-d"); // se asignan fechas validas, devueltas en formato aaaa-mm-dd
  30.                       }
  31.              return count($dias_laborables);
  32.     }
  33.      
  34.     //Uso: diasLaborables($fecha_inicio, $fecha_fin);
  35.     //Devuelve un número que son los días laborables entre las dos fechas dadas

Espero que te sirva.

Etiquetas: dias, fecha, mysql, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:49.