Ir al contenido


Foto

comparar fechas


  • Por favor identifícate para responder
12 respuestas en este tema

#1 Noe Velazquez Hernandez

Noe Velazquez Hernandez

    Member

  • Miembros
  • PipPip
  • 30 mensajes

Escrito 05 mayo 2018 - 09:17

Hola Foro !!!

esperando me puedan ayudar. es con lo siguiente.

tengo una tabla con 2 campos tipo DATE (fec_inicio y fec_final) como puedo compararlas ? el usuario en un formulario va introducir una fecha y dicha fecha no debe estar dentro del rango de fec_inicio y fec_final

ejemplo:

fec_inicio=2018-12-01
fec_final=2018-12-31

fecha_usuario= 2018-12-15 

como la fecha del usuario esta dentro del rango quiero mandar un mensaje diciendo fecha invalida

como puedo hacer esto ?

GRACIAS

Hola Foro !!!

esperando me puedan ayudar. es con lo siguiente.

tengo una tabla con 2 campos tipo DATE (fec_inicio y fec_final) como puedo compararlas ? el usuario en un formulario va introducir una fecha y dicha fecha no debe estar dentro del rango de fec_inicio y fec_final

ejemplo:

fec_inicio=2018-12-01
fec_final=2018-12-31

fecha_usuario= 2018-12-15 

como la fecha del usuario esta dentro del rango quiero mandar un mensaje diciendo fecha invalida

como puedo hacer esto ?


  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 mayo 2018 - 10:48

Hola Foro !!!

esperando me puedan ayudar. es con lo siguiente.

tengo una tabla con 2 campos tipo DATE (fec_inicio y fec_final) como puedo compararlas ? el usuario en un formulario va introducir una fecha y dicha fecha no debe estar dentro del rango de fec_inicio y fec_final

ejemplo:

fec_inicio=2018-12-01
fec_final=2018-12-31

fecha_usuario= 2018-12-15 

como la fecha del usuario esta dentro del rango quiero mandar un mensaje diciendo fecha invalida

como puedo hacer esto ?

GRACIAS

Hola Foro !!!

esperando me puedan ayudar. es con lo siguiente.

tengo una tabla con 2 campos tipo DATE (fec_inicio y fec_final) como puedo compararlas ? el usuario en un formulario va introducir una fecha y dicha fecha no debe estar dentro del rango de fec_inicio y fec_final

ejemplo:

fec_inicio=2018-12-01
fec_final=2018-12-31

fecha_usuario= 2018-12-15 

como la fecha del usuario esta dentro del rango quiero mandar un mensaje diciendo fecha invalida

como puedo hacer esto ?

 

A ver si te estoy entendiendo, ¿tu idea es ejecutar una instrucción SQL (un select posiblemente) filtrando por la condición "fuera del rango" de esas dos fechas?

Si es el caso, basta una instrucción SQL cuyo where tenga esta forma:


sql
  1. WHERE (fecha_filtro < fecha_inicio) OR (fecha_filtro > fecha_fin)

Si fuera dentro del rango, la condición es el opuesto:


sql
  1. WHERE (fecha_filtro >= fecha_inicio) AND (fecha_filtro <= fecha_fin)

Aunque el estándar SQL ofrece la expresión BETWEEN para estos casos:


sql
  1. WHERE fecha_filtro BETWEEN fecha_inicio AND fecha_fin

Pero tengo que admitir que no he probado con alguna contraparte del uso del BETWEEN. Tengo mis reservas de que algo como esta expresión pueda funcionar:


sql
  1. WHERE fecha_filtro NOT BETWEEN fecha_inicio AND fecha_fin

En teoría la expresión es legal. Y existe la posibilidad de que funcione como lo esperado, pero también puede que esto también juegue en como lo interprete el motor.

 

Saludos,


  • 0

#3 Noe Velazquez Hernandez

Noe Velazquez Hernandez

    Member

  • Miembros
  • PipPip
  • 30 mensajes

Escrito 06 mayo 2018 - 06:21

A ver si te estoy entendiendo, ¿tu idea es ejecutar una instrucción SQL (un select posiblemente) filtrando por la condición "fuera del rango" de esas dos fechas?

Si es el caso, basta una instrucción SQL cuyo where tenga esta forma:


sql
  1. WHERE (fecha_filtro < fecha_inicio) OR (fecha_filtro > fecha_fin)

Si fuera dentro del rango, la condición es el opuesto:


sql
  1. WHERE (fecha_filtro >= fecha_inicio) AND (fecha_filtro <= fecha_fin)

Aunque el estándar SQL ofrece la expresión BETWEEN para estos casos:


sql
  1. WHERE fecha_filtro BETWEEN fecha_inicio AND fecha_fin

Pero tengo que admitir que no he probado con alguna contraparte del uso del BETWEEN. Tengo mis reservas de que algo como esta expresión pueda funcionar:


sql
  1. WHERE fecha_filtro NOT BETWEEN fecha_inicio AND fecha_fin

En teoría la expresión es legal. Y existe la posibilidad de que funcione como lo esperado, pero también puede que esto también juegue en como lo interprete el motor.

 

Saludos,

 

Hola Delphius  gracias por responder !!!

creo volverme loco omití mencionar que el input del formulario donde el usuario va a dijitar la fecha tambien es del tipo DATE 

 

con esto WHERE (fecha_filtro < fecha_inicio) OR (fecha_filtro > fecha_fin)

siempre me dice que esta dentro del rango aunque no se verdad

 

con esto WHERE (fecha_filtro >= fecha_inicio) AND (fecha_filtro <= fecha_fin)

lo mismo

 

no se que hacer!!!


  • 0

#4 Noe Velazquez Hernandez

Noe Velazquez Hernandez

    Member

  • Miembros
  • PipPip
  • 30 mensajes

Escrito 06 mayo 2018 - 06:54

Hola Delphius Gracias por responder !!!

 

con esto sentencia

WHERE (fecha_filtro < fecha_inicio) OR (fecha_filtro > fecha_fin)

me dice que esta fuera de rango

 

con esta sentencia

WHERE (fecha_filtro >= fecha_inicio) AND (fecha_filtro <= fecha_fin)

me dice que esta fuera de rango

 

estuve probando y al parecer es el formato de la fecha por que lo busco por el numero de empleado y si lo encuentra pero cuando comparo las fecha no hace lo indicado

olvide mencionar que el tipo del input del formulario es de tipo DATE


  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 06 mayo 2018 - 09:49

¿Podrías mostrarnos el script? A ver que puede estar fallando.

Saludos,
  • 0

#6 Noe Velazquez Hernandez

Noe Velazquez Hernandez

    Member

  • Miembros
  • PipPip
  • 30 mensajes

Escrito 06 mayo 2018 - 06:57

hola Delphius !!!

este es el scrip donde se captura la fecha inicio y la fecha final


php
  1. <?
  2. //ob_start();
  3. require ("conecta.php");
  4. $pnum = $_POST['num'];
  5. $lista = "Select * From plantilla Where num_emp = $pnum";
  6. $resultado = mysqli_query($conectado,$lista);
  7. $dato = mysqli_fetch_assoc($resultado);
  8. $linea = mysqli_num_rows($resultado);
  9. if ($linea > 0 ){
  10. ?>
  11. <!DOCTYPE html>
  12. <html lang="en">
  13. <head>
  14. <title>Altas Notas Buenas</title>
  15. <meta charset="UTF-8">
  16. <link rel="stylesheet" href="css/altanb1.css">
  17. </head>
  18. <script language="javascript">
  19. function pantalla_ant(){
  20. window.location='altanb1.php';
  21. }
  22. function menu_ant(){
  23. window.location='menu_notbue.php';
  24. }
  25. </script>
  26. <body>
  27. <form name="f" action="altanb3.php" method="POST">
  28. <div id="todo">
  29. <h1>Direccion General de Administracion</h1>
  30. <h2>Direccion de Recursos Humanos</h2>
  31. <h3>U. D. de Movimientos de Personal</h3>
  32. <br>
  33. <hr />
  34. <br>
  35. <div id="izq">
  36. <p>Num. Empleado</p>
  37. <input type="number" name="num1" id="uno" value="<? echo $dato[num_emp]; ?>"> <!--disabled -->
  38. <p>Paterno</p>
  39. <input type="text" name="pat1" id="dos" value="<? echo $dato['ap_paterno']; ?>">
  40. <p>Materno</p>
  41. <input type="text" name="mat1" id="dos" value="<? echo $dato['ap_materno']; ?>">
  42. <p>Nombre</p>
  43. <input type="text" name="nom1" id="dos" value="<? echo $dato['nombre']; ?>">
  44. <p>Signo</p>
  45. <input type="text" name="sig1" id="uno" value="+">
  46. <p>Periodo</p>
  47. <input type="date" name="rf1" id="tres" tabindex="1" autofocus required>
  48. <input type="date" name="rf2" id="tres" tabindex="2" required>
  49. </div>
  50. <div id="der">
  51. <p>Codigo Puesto</p>
  52. <input type="text" name="cod1" id="uno" value="<? echo $dato['cod_puesto']; ?>" >
  53. <p>Nivel</p>
  54. <input type="number" name="niv1" id="uno" value="<? echo $dato[niv_puesto]; ?>" >
  55. <p>Plaza</p>
  56. <input type="text" name="pla1" id="uno" value="<? echo $dato['plaza']; ?>" >
  57. <p>Descripcion</p>
  58. <input type="text" name="des1" id="uno" value="ASISTENCIA" >
  59. <p>Clasificador</p>
  60. <input type="number" name="cla1" id="uno" tabindex="3" required>
  61. <input type="hidden" name="tnn1" value="<? echo $dato[tn]; ?>">
  62. </div>
  63. </div>
  64. <div id="centra">
  65. <input type="submit" name="boton" value="Registra Tarjeta" class="btn btn-ver" tabindex="4">
  66. <input type="button" name="boton" value="Nuevo Registro" class="btn btn-ama" onclick="pantalla_ant()">
  67. <input type="button" name="boton" value="Menu Principal" class="btn btn-roj" onclick="menu_ant()">
  68. </div>
  69. </form>
  70. </body>
  71. </html>
  72. <?
  73. }else{
  74. echo "<script type='text/javascript'>
  75. alert('El numero de Empleado ".$pnum." que digito no existe');
  76. window.location='altanb1.php';
  77. </script>" ;
  78. }
  79. ?>


  • 0

#7 Noe Velazquez Hernandez

Noe Velazquez Hernandez

    Member

  • Miembros
  • PipPip
  • 30 mensajes

Escrito 06 mayo 2018 - 06:58

este es el donde quiero comparar


php
  1. $entra_new = 0;
  2. require ("conecta.php");
  3.  
  4. $pnum = $_POST[num1];
  5. $unof = $_POST[rf1];
  6. echo 'fecha del usuario '.$unof;
  7. echo "<br/>\n";
  8.  
  9. $lisfec1 = "Select * From nuevo Where numemp = $pnum";
  10. $resul1 = mysqli_query($conectado,$lisfec1);
  11. $dfecha1 = mysqli_fetch_assoc($resul1);
  12. $resfec1 = $dfecha1['funo'] ;
  13.  
  14. $lisfec2 = "Select * From nuevo Where numemp = $pnum";
  15. $resul2 = mysqli_query($conectado,$lisfec2);
  16. $dfecha2 = mysqli_fetch_assoc($resul2);
  17. $resfec2 = $dfecha2['fdos'] ;
  18. echo "<br/>\n";
  19. echo 'fecha uno '.$resfec1;
  20. echo "<br/>\n";
  21. echo 'fecha dos '.$resfec2;
  22.  
  23. if ($resfec1>$unof && $resfec2<$unof){
  24. echo "alguna de las tarjetas ya se encuantra registrada";
  25. }else{
  26. echo "fecha fuera de rango";
  27. echo "<br/>\n";
  28. $entra_new = 1;
  29. }
  30.  
  31. $feclis = "Select numemp,funo,fdos From nuevo Where numemp=$pnum and (funo>=$unof and fdos<=$unof";
  32. $resul1 = mysqli_query($conectado,$feclis);
  33. $dato = mysqli_fetch_assoc($resul1);
  34. $linea = mysqli_num_rows($resul1);
  35. if ($linea > 0){
  36. echo "<br/>\n";
  37. echo "dentro del rango";
  38. }else{
  39. echo "<br/>\n";
  40. echo "fuera del rango";
  41. }


  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 06 mayo 2018 - 08:10

He editado tu mensaje para darle formato/etiquetado a tu código. Recuerda que puedes hacer esto desde el propio editor  en el que escribes tus posts pulsando en el botón "< >". Te mostrará una ventana modal en la quel elijes el lenguaje y luego pegas el código.

Asi resulta más fácil de entenderlo.

 

Estaré viendo el tema.

Pero asi de a simple vista rápida puede que el asunto está en que yo he asumido que la comprobación la hacías desde el motor de base de datos (por ello lo he preguntado antes) y mi propuesta estaba pensada para hacerlo vía SQL.

Por lo estoy viendo, la evaluación la estás por realizar desde PHP. En este caso la comparación no puede hacerse de forma directa. Necesitas de una función que pase de cadena a fecha. Para el caso la función que buscas es strtotime.

Y entonces la comparación ahí si es posible. Como para que te orientes:


php
  1. if (strtotime($fecha) < strtotime($fechaini) || strtotime($fecha) > strtotime($fechafin)){
  2. // codigo
  3. }

Ten presente el tema de la zona horaria cuando trabajes con strtotime. Lee el enlace que te puse.

 

Saludos,


  • 0

#9 Noe Velazquez Hernandez

Noe Velazquez Hernandez

    Member

  • Miembros
  • PipPip
  • 30 mensajes

Escrito 06 mayo 2018 - 09:28

Hola Delphius.

 

te puse las dos formas con que trate de solucionarlo, voy a ver el enlace y posteriormente te informo los avances

GRACIAS.


  • 0

#10 Noe Velazquez Hernandez

Noe Velazquez Hernandez

    Member

  • Miembros
  • PipPip
  • 30 mensajes

Escrito 07 mayo 2018 - 09:34

buenos días Delphius.

 

asi quedo


php
  1. $con1 = "Select * From nuevo Where numemp = $pnum";
  2. $res1 = mysqli_query($conectado,$con1);
  3. $dat1 = mysqli_fetch_assoc($res1);
  4. $fff1 = $dat1['funo'] ;
  5.  
  6. $con2 = "Select * From nuevo Where numemp = $pnum";
  7. $res2 = mysqli_query($conectado,$con2);
  8. $dat2 = mysqli_fetch_assoc($res2);
  9. $fff2 = $dat2['fdos'] ;
  10.  
  11. if (strtotime($unof) >= strtotime($fff1) || strtotime($unof) <= strtotime($fff2)) {
  12. echo "<script type='text/javascript'>
  13. alert('Algunas de las tarjetas que desea capturas ya estan registradas');
  14. window.location='altanb1.php';
  15. </script>";
  16. }else{
  17. $entra_new = 1;
  18. }

 

perdi mucho tiempo tratando de yo solucionarlo.
te agradezco que compartas tus conocimientos
MUCHAS GRACIAS......
un abrazo desde Mexico.

  • 1

#11 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 07 mayo 2018 - 10:49

 

buenos días Delphius.

 

asi quedo


php
  1. $con1 = "Select * From nuevo Where numemp = $pnum";
  2. $res1 = mysqli_query($conectado,$con1);
  3. $dat1 = mysqli_fetch_assoc($res1);
  4. $fff1 = $dat1['funo'] ;
  5.  
  6. $con2 = "Select * From nuevo Where numemp = $pnum";
  7. $res2 = mysqli_query($conectado,$con2);
  8. $dat2 = mysqli_fetch_assoc($res2);
  9. $fff2 = $dat2['fdos'] ;
  10.  
  11. if (strtotime($unof) >= strtotime($fff1) || strtotime($unof) <= strtotime($fff2)) {
  12. echo "<script type='text/javascript'>
  13. alert('Algunas de las tarjetas que desea capturas ya estan registradas');
  14. window.location='altanb1.php';
  15. </script>";
  16. }else{
  17. $entra_new = 1;
  18. }

 

perdi mucho tiempo tratando de yo solucionarlo.
te agradezco que compartas tus conocimientos
MUCHAS GRACIAS......
un abrazo desde Mexico.

 

 

Me alegro que ahora este funcionando.

He editado de nuevo tu mensaje para darle etiqueta al codigo. Te agradecería que tu también lo hagas. Como te dije en el mensaje anterior, tienes el botón "<>" para eso.

 

Por otro lado, veo que haces una consulta adicional innecesaria.

Nota que para obtener fff1 y fff2 estás ejecutando la misma consulta, con el mismo filtrado. Puedes obtener ambos campos desde una unica consulta ya que estas trayendo todos los campos con el asterisco.

 

Esto te ayudará a reducir tiempos de procesamiento, ganaras perfomance. Y por cierto, para más "power", evita el uso de asteriscos y pide que el select te traiga unicamente los campos que vas a necesitar. Si la idea es leer solo funo y fdos pues ¡pide solamente estos dos! ;)

 

Saludos,


  • 0

#12 Noe Velazquez Hernandez

Noe Velazquez Hernandez

    Member

  • Miembros
  • PipPip
  • 30 mensajes

Escrito 08 mayo 2018 - 06:40

Hola Delphius !!!

 

espero algún día tener los conocimientos que tu tienes. y tienes razón hago doble consulta y sobre el asterisco lo aplicare.

 

Gracias 

 

Atte.

programador novato en html, php, css y javascript 


  • 0

#13 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 08 mayo 2018 - 02:31

Puedes hacer una simple función y así utilizarlo en otros lugares de la aplicación y no tener tantas líneas de código:


php
  1. function VerSiEstaEnRango($FechaIni, $FechaFin, $FechaInput)
  2. {
  3. $_ini = strtotime($Fechaini);
  4. $_fin = strtotime($FechaFin);
  5. $_input = strtotime($FechaInput);
  6.  
  7. return (($_input >= $_ini) && ($_input <= $_fin));
  8. }

Y lo puedes usar así:


php
  1. if(VerSiEstaEnRango($fecha1,$fecha2,$fecha_usuario)) {
  2. //Devuelve Falso o verdadero según el caso
  3. }

Saludos.


  • 0




IP.Board spam blocked by CleanTalk.