Comparar fechas en formato MySQL con PHP

Es un problema con el que cualquier persona que utilice PHP y MySQL se encuentra muy a menudo. Hasta que PHP no trate directamente esos datos y se sobrecarguen internamente los operadores de comparación para que todo sea directo, tendremos que valernos de métodos como el que os muestro para poder comparar dos fechas en formato MySQL con PHP (formato MySQL, es decir fecha en formato inglés con guiones y el orden invertido respecto al nuestro).

La siguiente función devuelve:

  • 1 si la fecha a es mayor que la fecha b
  • 0 si son iguales
  • -1 si la fecha a es menor que la fecha b
function comparar_fechas_mysql($a, $b)
	{
		$a_v=explode("-",$a);
		$anyo_a = $a_v[0];
		$mes_a = $a_v[1];
		$dia_a = $a_v[2];
		
		$b_v=explode("-",$b);
		$anyo_b = $b_v[0];
		$mes_b = $b_v[1];
		$dia_b = $b_v[2];
		
		if($anyo_a > $anyo_b)
			return 1;
		else
		{
			if($anyo_a < $anyo_b)
				return -1;
			else
			{
				if($mes_a > $mes_b)
					return 1;
				else
				{
					if($mes_a < $mes_b)
						return -1;
					else
					{
						if($dia_a > $dia_b)
							return 1;
						else
						{
							if($dia_a < $dia_b)
								return -1;
							else
								return 0;
						}
					}
				}
			}
		}
	}

Esperamos vuestras sugerencias, mejoras y rectificaciones de este y todos los tips de programación que vayamos incorporando.

Author Description

F. Javier Carazo Gil

Casi Ingeniero Informático, co-fundador y administrador de Linux Hispano, además de desarrollar software y mantener sistemas en el CSIC, hace poco he fundado junto con Alberto Hornero una start-up: CODECTION donde trabajamos con software libre. Puedes saber más sobre mí, mi vida laboral, mis libros, mis artículos y mi día a día en @fjcarazo y en mi perfil público de LinkedIn.

  • Roger

    Y por qué no comparar enteros? UNIX_TIME, tanto php como mysql tienen funciones para darte este tiempo.

    Saludos.

  • http://www.jcarazo.com carazo

    Toda sugerencia es buena. Tu proposición es mucho más decente a cuanto tiempo de cómputo se refiere (o al menos eso parece). Pero bueno, la que propongo tiene el valor didáctico de sacar día, mes y año, de la fecha, que también pueden ser de interés.

  • josean

    Hola, yo no se ni de php ni de mysql, pero en programacion en general, una manera sencilla de comparar fechas seria:

    fecha_a= anyo_a*10000 + mes_a*100 + dia_a;
    fecha_b= anyo_b*10000 + mes_b*100 + dia_b;

    if(fecha_a > fecha_b)
    return 1;
    elseif(fecha_a = fecha_b)
    return 0;
    else
    return -1

    Es decir….si las fechas son a=16/12/2008 y el b=31/12/2008, tendriamos
    fecha_a=20081216
    fecha_b=20081231

    y como 20081216 < 20081231, pues devolveria -1

  • http://www.jcarazo.com carazo

    @josean: Otra posibilidad a tener en cuenta. Muchas gracias.

    Comparando las cadenas directamente también podríamos ordenar las fechas (tened en cuenta que en formato inglés la fecha se escribe año-mes-día), es decir, del más relevante al menos, como se ordenan los números y las cadenas.

  • Roger

    Otra manera que hay ahora en PHP >= 5, la clase DateTime con sus otras clases DateFormat y algunas más, mirarlas, parecen muy interesantes.

    Saludos.

  • jonathan

    yo necesito es comparar fecha inicio con fecha final de una BD donde la fecha la estraigo del mismo campo de la BD para decir que fecha inicio no sea mayor a fecha final, agradeceria todala ayuda posible por ustedes….

  • Markitos Mendez

    tengo una problematica similar pero soy nuevo en php y me gustaria que me dieran una mano

    lo que tengo es una tabla en la BD llamada empleados dentro de esta tengo un campo fecha con informacion de la siguiente manera 21/may/2013 pero me piden que la fecha no sea asi si no con el siguiente formato 21052013 veo que la funcion que crearon ustedes es algo similar alguna ayuda de antemano gracias