Como convertir una fecha de Lenguaje Natural a tipo DATE
Utilizando manejo de cadenas en PHP, se trata de convertir una fecha dada como cadena en formato LongDate al formato admitido por MySQL YYYY-MM-DD.
Comparto este código para aquellos que pudieran tener un problema similar.
Me pasaron una base de datos que contenÃa un campo fecha, pero dicho campo fecha era en realidad un campo de tipo Texto en donde habÃan capturado la fecha como una cadena y yo lo necesitaba de tipo Fecha obligatoriamente.
Las fechas originalmente están en el siguiente formato:
Lunes, 10 de Febrero de 2001 Miércoles, 24 de Diciembre de 2006 Jueves, 3 de Agosto de 1998 Martes, 6 de Enero de 2003 ...
Procedimiento
En primer lugar hice una revisión de la información verificando que el formato de las fechas es consistente, es decir que no hay errores de ortografÃa ni variaciones en el formato, todas las fechas cumplen con el formato: DIA[coma] NUMERO[ de ]MES[ de ]AÑO Lo cual facilitó bastante la conversión ya que si ubiera habido variaciones tendrÃa que uniformarlo primero.
Condiciones iniciales
Tengo una tabla en mi base de datos de nombre DATA1 y entre sus campos se encuentra el ID que es mi Campo Llave y FECHA que es la que tiene las caracterÃsticas que mencioné.
<?php
$server = "localhost"; $user = "root"; $pass = ""; $database = "test";
$link = mysql_connect($server,$user,$pass); mysql_select_db($database,$link) or die(mysql_error());
//Comienzo creando una tabla para ver el resultado en pantalla echo "<table border=1>"; $sql="SELECT id, fecha FROM data1 order by id limit 0,10000"; $query = mysql_query($sql) or die(mysql_error()); while($row = mysql_fetch_array($query)) { $fechacad=$row[1]; if("$fechacad"!="") //<-- verifico que el campo fecha no esté vacÃo { //Lo paso a mayúsculas para evitar las "altas y bajas" $fechacad=strtoupper($fechacad); //Reemplazo los [Nombres del Mes] por el número correspondiente: $fechacad=str_replace("ENERO",'01',$fechacad); $fechacad=str_replace("FEBRERO",'02',$fechacad); $fechacad=str_replace("MARZO",'03',$fechacad); $fechacad=str_replace("ABRIL",'04',$fechacad); $fechacad=str_replace("MAYO",'05',$fechacad); $fechacad=str_replace("JUNIO",'06',$fechacad); $fechacad=str_replace("JULIO",'07',$fechacad); $fechacad=str_replace("AGOSTO",'08',$fechacad); $fechacad=str_replace("SEPTIEMBRE",'09',$fechacad); $fechacad=str_replace("OCTUBRE",'10',$fechacad); $fechacad=str_replace("NOVIEMBRE",'11',$fechacad); $fechacad=str_replace("DICIEMBRE",'12',$fechacad); //Suprimo los nombres del [Nombre del DÃa] ya que no me resulta relevante: $fechacad=str_replace("LUNES, ",'',$fechacad); $fechacad=str_replace("MARTES, ",'',$fechacad); $fechacad=str_replace("MIERCOLES, ",'',$fechacad); $fechacad=str_replace("JUEVES, ",'',$fechacad); $fechacad=str_replace("VIERNES, ",'',$fechacad); $fechacad=str_replace("SABADO, ",'',$fechacad); $fechacad=str_replace("DOMINGO, ",'',$fechacad); //Suprimo reemplazo los [ de ]'s por diagonales (puede ser cualquier otro caracter): $fechacad=str_replace(" DE ",'/',$fechacad); /*--------------------------------------- En este momento la fecha ya tiene el formato: 21/03/2007 Lo cual es ya un formato de fecha aceptable en algunos sistemas, pero no en MySQL. -----------------------------------------*/ // Con una expresión regular descompongo la fecha en sus elementos if(ereg("([0-9]{1,2})/([0-9]{2})/([0-9]{4})",$fechacad,$res)) { /*-------------------------------------- En este momento la fecha se dividió en: $res[1] = 21 $res[2] = 03 $res[3] = 2007 AsÃq ue simplemente se vuelve a armar la cadena con el acomodo deseado que es: 2007-03-21 ----------------------------------------*/ $aux="{$res[3]}-{$res[2]}-{$res[1]}"; // Muestro en pantalla el antes y el después: echo "<tr><td> {$row[1]} </td><td> $aux </td></tr>\n"; /* -------------------------------------- // El siguiente código es para actualizar // la información en la base de datos: // (se recomienda omitirlo en las primeras corridas) $sql2="update data1 set fecha='$aux' where id={$row[0]}"; mysql_query($sql2) or die("ERROR:". mysql_error()); ----------------------------------------*/ } else { /* En caso de que el formato de fecha no coincida con el esperado en la expresión regular marcamos el error y detenemos el programa. */ die("<tr><td> Error con {$row[1]} </td></tr>"); } } }
?> |
Importante: Puse toda la documentación como comentarios dentro del código fuente, les recomiendo leerlo con cuidado y entenderlo antes de utilizarlo con una base real.
Y como siempre: NO OLVIDEN RESPALDAR PRIMERO.
Después de haber ejecutado el proceso, me metà al PHPMYADMIN y cambié el tipo de dato a Tipo DATE y ya lo pude usar como una fecha estándar.
|