Conversión de datos a Daettime

Tengo un campo de tipo date time que quiero rellenar con el contenido de otros tres campos, uno es una fecha (date), otro es una hora (varchar 5) y el otro indica si la hora es antes o luego de meridiano (varchar, 1);
El asunto es que tengo una base de datos muy extensa y las formas que he ideado para hacer esta actualización requieren de demasiado tiempo.
Estoy utilizando MySql y necesito hacerlo con una sola instrucción contra el servidor y éste me indica que el valor obtenido no es válido para el campo, a continuación muestro la instrucción que estoy utilizando ¿qué estoy haciendo mal? ¿Qué me falta colocar?
update tabla set fechayhora =
   Cast(
     Concat(
      case
         when day(emitido)<10 then concat('0',day(emitido))
         when day(emitido)>=10 then day(emitido)
      end
       ,'/',
      case
         when month(emitido)<10 then concat('0', month(emitido))
          when month(emitido)>=10 then month(emitido)
       end
          ,'/',year(emitido),' ',horadoc,
       case
          when mantar = '1' then ':00 a.m.'
          when mantar = '2' then ':00 p.m.'
        end
        )
       as datetime
     )
Gracias de antemano por la ayuda
{"lat":10.1554497283339,"lng":-67.4546813964844}

1 Respuesta

Respuesta
1
El campo datetime tiene el formato: año mes y día con sintaxis "relajada", o sea, que puedes poner: YYYY MM DD HH MM con cualquier delimitador entre las partes de la fecha y la hora. Para la hora tendrás que sumar 12 para las que sean pm.
Personalmente, yo utilizaría la siguiente sentencia de concatenación haciendo unos cambios:
concat(emitido,' ',horadoc + (12 * mantar),':00')
El campo hora lo puedes hacer de 2 caracteres (veo que los minutos no te interesan, aunque si los datos solo guardan horas da lo mismo), y el campo que indica si es am o pm sería 0 - am 1 - pm para poder hacer la multiplicación, si no quieres cambiar el valor del campo siempre puedes poner: concat(emtido,' ', horadoc + (12 * (mantar - 1)),':00'). Si el campo emitido es de tipo date, automáticamente formatea bien la hora.
Hola Derfelius,
Gracias por responder, sin embargo necesito aclarar un poco más para poder obtener la respuesta más adecuada.
El campo 'horadoc' es de tipo varchar con longitud de 5 y tiene el formato HH:MM
El campo mantar es de tipo varchar con longitud de 2 'am' / 'pm' (creo que por eso no me sirve para multiplicarlo y en todo caso eso sería lo de menos), y
el campo emitido es de tipo date.
Hay una consideración adicional, hubo una época en la que el campo horadoc fue alimentado en formato 24 y otra en la que fue alimentado en formato 12 (sí, se que no es fácil pero es así)
Muchas gracias de antemano por tu respuesta
Uff, tienes que normalizar bien esa base de datos, que imagino que es lo que estás haciendo. Para el primer caso utilizaría la siguiente sentencia:
update tabla set fechayhora =  interval (strcmp(mantar, "am") * 12) hour + (concat(emitido,' ', horadoc)) ;
Para los campos que estén en formato 24 horas:
update tabla set fechayhora = concat(emitido,' ', horadoc) ;
Hola Derfelius,
Efectivamente estoy normalizando, y agregando el campo en varias tablas, razón que me lleva a eralizar todo esto y a solicitud de los usuarios (son muchos) estoy tratando de hacerlo directo sobre los datos del servidor para optimizar el problema de tiempo, ya hice una pruebas a través de programa y me funciona, pero se tarda 1 hora en actualizar cada tabla. Voy a hacer las pruebas, de lo que me comentas para tratar de optimizar el tiempo de ejecución.
Muchas gracias por tu valiosa ayuda.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas