Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Convertir fecha (formato varchar) a (formato date)

Estas en el tema de Convertir fecha (formato varchar) a (formato date) en el foro de Mysql en Foros del Web. Un saludo para todos. Metí la pata cuando diseñé una tabla. Tenía un campo de fecha y, por no complicarme la vida (ahora si que ...
  #1 (permalink)  
Antiguo 22/11/2006, 09:04
Avatar de holahola  
Fecha de Ingreso: mayo-2005
Ubicación: Móstoles - (Madrid)
Mensajes: 214
Antigüedad: 18 años, 11 meses
Puntos: 1
Convertir fecha (formato varchar) a (formato date)

Un saludo para todos.

Metí la pata cuando diseñé una tabla. Tenía un campo de fecha y, por no complicarme la vida (ahora si que me la he complicado) la definí com varchar(10) y sus valores están almacenados como dd/mm/aaaa.

Ahora tengo la necesidad de hacer comparaciones con la fecha y hubiera necesitado que el formato de dicha fecha fuera "date" y con el valor que mysql tiene por defecto que es YYYY-mm-dd.

Mi pregunta es la siguiente:

¿Podría, con un update, modificar el formato y el valor de dicho campo de fecha de todas las filas de mi tabla?¿O con un insert... select (sobre una nueva tabla)?

Muy agradecido.
  #2 (permalink)  
Antiguo 22/11/2006, 11:11
Avatar de holahola  
Fecha de Ingreso: mayo-2005
Ubicación: Móstoles - (Madrid)
Mensajes: 214
Antigüedad: 18 años, 11 meses
Puntos: 1
Supongo que esto tendría una solución con sólo comandos sql, pero como no se me ocurre como, lo he solucionado con un script php (quizás el moderador deba mover este hilo al foro de php).

Mi tabla era:

Código PHP:
`idint(5unsigned NOT NULL auto_increment,
 `
nombrevarchar(50character set utf8 default NULL,
 `
fechavarchar(10NOT NULL
Le he añadido un nuevo campo: "fecha1" con tipo date.

Luego le he pasado el siguiente script php:
Código PHP:
<?php
// Conexion, seleccion de base de datos
$enlace mysql_connect('localhost''pepe''pepe')
   or die(
'No pudo conectarse : ' mysql_error());
echo 
'Conexión establecida<br>';
mysql_select_db('dbangel') or die('No pudo seleccionarse la BD.');

// Realizar una consulta SQL
echo '<br>Listado de la tabla, antes de modificar';
$ssql  'SELECT * FROM departamentos';
$resultado mysql_query($ssql) or die('La consulta fall&oacute;: ' mysql_error());

echo 
"<table>";
while (
$row mysql_fetch_array($resultado)) {
   echo 
"<tr>";
       echo 
"<td>$row[id]</td>";
       echo 
"<td>$row[nombre]</td>";
       echo 
"<td>$row[fecha]</td>";
       echo 
"<td>$row[fecha1]</td>";
   echo 
"</tr>";

   
$dia=substr($row[fecha],0,2);
   
$mes=substr($row[fecha],3,2);
   
$anio=substr($row[fecha],6,4);
   
$fecha=$anio."-".$mes."-".$dia;
   
$id=$row[id];

   
// Realizar un update SQL a la fila en curso
   
$ssql  'UPDATE departamentos SET fecha1 = "'.$fecha.'" WHERE id='.$id.' ';
   
mysql_query($ssql) or die('La consulta fall&oacute;: ' mysql_error());
}
echo 
"</table>\n";
mysql_free_result($resultado);

// Realizar una consulta SQL
echo '<br>Listado de la tabla, despues de modificar';
$ssql  'SELECT * FROM departamentos';
$resultado mysql_query($ssql) or die('La consulta fall&oacute;: ' mysql_error());

// Impresion de resultados en HTML
echo "<table>";
while (
$row mysql_fetch_array($resultado)) {
   echo 
"<tr>";
       echo 
"<td>$row[id]</td>";
       echo 
"<td>$row[nombre]</td>";
       echo 
"<td>$row[fecha]</td>";
       echo 
"<td>$row[fecha1]</td>";
   echo 
"</tr>";
}
echo 
"</table>";
mysql_free_result($resultado);

// Cerrar la conexion
echo '<br>Cierre de la conexión';
mysql_close($enlace);
?>
El script lo que hace es, primero lista la tabla, fila a fila y al mismo tiempo la va modificando. Luego arranca otro bucle para mostrar como queda la tabla, ya modificada.


Lo último que queda, es borrar el antiguo campo de "fecha" y renombrar el "fecha1" a fecha.

Un saludo.
  #3 (permalink)  
Antiguo 22/11/2006, 11:38
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Así es .. con una sóla sentencia SQl lo podrías resolver.

En SQL tienes funciones para manejar Strings (cadenas) al igual que en PHP o cualquier otro lenguaje de programación, hasta tienes posibilidad de usar expresiones regulares incluso. Se trata de usarlas en el "UPDATE", sin "condicional" (para que aplique a toda la tabla) y sin cambiar el tipo de dato de tu campo "fecha" actual (un varchar()) hasta que termines el proceso.

Es decir .. aplicas un UPDATE tipo:
Código PHP:
UPDATE tabla SET fecha=CONCAT(SUBSTRING(fecha,6,9),'-',SUBSTRING(fecha,3,4),'-',SUBSTRING(fecha,0,2)) 
(no me he puesto a probarlo ni he contado bien los rangos de los caracteres que necesitas .. pero por ahí va el tema. Seguro que tiene várias soluciones en SQL este problema .. sobre todo con expresiones regulares incluso ...)

más info:
http://dev.mysql.com/doc/refman/5.0/...functions.html

Y luego cambias el tipo de campo a un "DATE".

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 24/11/2006, 04:43
Avatar de holahola  
Fecha de Ingreso: mayo-2005
Ubicación: Móstoles - (Madrid)
Mensajes: 214
Antigüedad: 18 años, 11 meses
Puntos: 1
Buenos días, Cluster: gracias.

No creas que había olvidado el agradecer tu correcta respuesta. Ayer y hoy ha habido problemas en el foro y no había forma de acceder; ahora mismo me he dado cuenta que ya se podía acceder.

Aunque conozco desde hace muchos años el lenguaje SQL, en las empresas en las que he trabajado no nos permitían utilizar sus funciones como la que me has indicado (chapó).

Por si le sirve a alguien, para su comprobación, aquí dejo un código de ejemplo con tu solución, aplicando SUBSTRING:
Código PHP:
-- 
-- 
crear la tabla
-- 
CREATE TABLE `ejemplo_fechas` (
  `
idint(5unsigned NOT NULL auto_increment,
  `
fechavarchar(10NOT NULL,
  
PRIMARY KEY  (`id`)
ENGINE=MyISAM ;

-- 
-- 
cargar la tabla con fecha en formato dd/mm/aaaa
-- 

INSERT INTO `ejemplo_fechasVALUES (1'31/01/2006');
INSERT INTO `ejemplo_fechasVALUES (2'28/02/2006');

-- 
-- 
modificar fecha a formato aaaa-mm-dd
-- 
UPDATE ejemplo_fechas SET 

fecha
=CONCAT(SUBSTRING(fecha,7,4),'-',SUBSTRING(fecha,4,2),'-',SUBSTRING(fecha,1,2));

-- 
-- 
modificar campo fecha a tipo campo 'date'
-- 
ALTER TABLE `ejemplo_fechasCHANGE `fecha` `fechaDATE NOT NULL
Un saludo.
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 20:21.