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

colocar 0 en datetime usando NOW()

Estas en el tema de colocar 0 en datetime usando NOW() en el foro de Mysql en Foros del Web. Hola a todos! espero que se encuentren bien estoy insertando desde un script que se ejecuta automaticamente cada media hora un registro que tiene el ...
  #1 (permalink)  
Antiguo 20/07/2012, 15:03
 
Fecha de Ingreso: septiembre-2010
Ubicación: Caracas
Mensajes: 83
Antigüedad: 13 años, 7 meses
Puntos: 6
colocar 0 en datetime usando NOW()

Hola a todos! espero que se encuentren bien

estoy insertando desde un script que se ejecuta automaticamente cada media hora un registro que tiene el tiempo datetime en que se ejecuta el script
El problema ocurre que el script ocurre por ejemplo a las 03:15 , pero guarda 03:15:01 , imagino que ese segundo o dos representan el tiempo real que se tarda el script en conectarse, enviar y ejecutar el script en el servidor.

ando usando la funcion NOW(), existe alguna manera de decirle dentro del script que guarde el NOW o la fecha actual pero que los segundos sean 00?

muchas gracias!
  #2 (permalink)  
Antiguo 20/07/2012, 19:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: colocar 0 en datetime usando NOW()

Cita:
El problema ocurre que el script ocurre por ejemplo a las 03:15 , pero guarda 03:15:01 , imagino que ese segundo o dos representan el tiempo real que se tarda el script en conectarse, enviar y ejecutar el script en el servidor.
En realidad, no, el problema es que para la interpretación del formato TIME, se requieren sí o sí los segundos, y si lo que estás metiendo es "03:15", eso en SQL significa "3 horas y 15 minutos", porque se parte de la lectura de izquierda a derecha, desde el valor más significativo (horas), al menos significativo (segundos).

Es habitual en programación suprimir la representación de los segundos, pero en bases de datos los segundos importan. Siempre.
Lo único que tienes que hacer es que el INSERT incluya la hora en el formato estándar de bases de datos: "HH:mm:ss".
¿Se entiende?

Es decir, lo que tienes que insertar es "00:03:15"...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 23/07/2012, 06:26
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: colocar 0 en datetime usando NOW()

Creo que el problema si viene del tiempo transcurrido entre la ejecución (o inicio) del script y el momento en que el servidor lee la query, si estas usando NOW() en la query.

Obiamente gnzsoloyo tiene razon en que debes respetar el formato de time hh:mm:ss pero creo que deberías capturar la hora (minutos y segundos) que desencadenan el script y usar ese dato en la query con lo que aun que transcurra media hora se insertara el valor que quieres....

No se si me explico pero el error es porque en realidad lees la hora dos veces, en el momento que lanzas el script y quando el servidor ejecuta la funcion NOW(). Incluso se podria dar que el servidor que ejecuta el script y el servidor de bbdd sean distintas maquinas y tengan horas distintas. (Supongamos que esto lo haces con php que corre bajo apache en un servidor en argentina y se conecta a un mysql alojado en un servidor en Sabadell, luego usando now() el problema no será de un segundo sino de 4 o 5 horas (creo) mas un segundo dependiendo de la epoca del año)
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 23/07/2012 a las 06:35
  #4 (permalink)  
Antiguo 23/07/2012, 08:23
 
Fecha de Ingreso: septiembre-2010
Ubicación: Caracas
Mensajes: 83
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: colocar 0 en datetime usando NOW()

Entiendo perfectamente lo que ambos quieren decir, quizas no me explique diciendo que el script ocurre a las 03:15:00 pero (entiendo que ell formato de base de datos es obligatorio que sea hh:mm:ss)
entonces deberia de obviar NOW() y mas bien construir una fecha en el script que guarde 03:15:00 (descartando si existen unos segundos, es decir, 03:15:02)
algun conocedor de perl que me de esa funcion? ya que realic el script en ese lenguaje pero poco lo conozco!

gracias a ambos!
  #5 (permalink)  
Antiguo 23/07/2012, 09:42
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: colocar 0 en datetime usando NOW()

Hola lap88:

No entiendo por qué la insistencia en quitar los segundos, si esto es mera presentación, pues simplemente utilizas DATE_FORMAT para presentar lo que se la fecha en el formato que quieras...

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     -> NOW(),
  3.     -> DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:00') now_;
  4. +---------------------+---------------------+
  5. | NOW()               | now_                |
  6. +---------------------+---------------------+
  7. | 2012-07-23 10:36:24 | 2012-07-23 10:36:00 |
  8. +---------------------+---------------------+
  9. 1 row in set (0.00 sec)

Ahora bien, si insistes en almacenar el dato sin los segundos, tendrías que convertir una doble conversión, es decir, primero convertir a String sin los segundos y después el string convertirlo a DATETIME:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     -> NOW(),
  3.     -> STR_TO_DATE(DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i'),
  4.     -> '%Y-%m-%d %H:%i') now_;
  5. +---------------------+---------------------+
  6. | NOW()               | now_                |
  7. +---------------------+---------------------+
  8. | 2012-07-23 10:38:35 | 2012-07-23 10:38:00 |
  9. +---------------------+---------------------+
  10. 1 row in set (0.00 sec)

Saludos
Leo.
  #6 (permalink)  
Antiguo 23/07/2012, 10:09
 
Fecha de Ingreso: septiembre-2010
Ubicación: Caracas
Mensajes: 83
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: colocar 0 en datetime usando NOW()

muy interesante eso leonardo_josue, tambien me sirve eso.
por los momentos me funciona construyendo el Datetime desde perl y colocandole 0 segundos
Cita:
my $t = localtime;
my $time = sprintf "%04d-%02d-%02d %02d:%02d:00", $t->year + 1900, $t->mon + 1, $t->mday, $t->hour, $t->min, $t->sec ;
y luego le paso a mysql esa variable como cadena de caracteres a la variable DATETIMe
la razon por la que necesito 0 segundos es porque los datos son para ser utilizados en report
es, donde los tiempos son con 0 segundos e intervalos de media hora, y los filtros para el reporte son iguales, por lo tanto si coloco en el filtro de la aplicacion hasta las 3 pm, los registros que tienen 03:00:01 no entrarán allí.

muchas gracias a todos! problema doblemente resuelto, ya que ahora puedo elegir el tiempo de ejecucion del servidor del script, o el de base de datos!

Última edición por lap88; 23/07/2012 a las 10:19
  #7 (permalink)  
Antiguo 23/07/2012, 11:37
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: colocar 0 en datetime usando NOW()

Hola de nuevo lap88:

En lo particular, cuando se trata de manejo de fechas en base de datos soy partidario de dejar que sea precisamente el motor de BD el que haga los cálculos o ajustes necesarios. Ignoró por ejemplo si PERL extrae la hora y fecha del cliente o si la hace del servidor. aquí podrías tener problemas de sincronía... dices que estás ejecutando el script cada media hora, mi pregunta sería, ¿quién está cronometrando la ejecución de ese script? si lo haces mediante un JOB de MySQL entonces deberías hacer la asignación de la hora tal y como te lo mencioné... si el cronómetro lo estás haciendo mediante programa, entonces sí creo que sería correcto como lo estás haciendo.

Saludos.
Leo.
  #8 (permalink)  
Antiguo 25/07/2012, 07:59
 
Fecha de Ingreso: septiembre-2010
Ubicación: Caracas
Mensajes: 83
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: colocar 0 en datetime usando NOW()

el script lo ejecuta un servidor de linux mediante la programacion de tareas (crontab), lo que hace es ejecutar cada media hora el script de perl, y este obtiene los datos necesarios de otro sistema y los almacena en la base de datos

Etiquetas: datetime
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 13:07.