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

UPDATE usando DateDiff

Estas en el tema de UPDATE usando DateDiff en el foro de Mysql en Foros del Web. Hola, no estoy pudiendo resolver como hacer un UPDATE en una tabla calculando una resta de fechas con DATEDIFF (cuyos restandos están en la misma ...
  #1 (permalink)  
Antiguo 08/06/2009, 20:33
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 18 años, 9 meses
Puntos: 28
UPDATE usando DateDiff

Hola, no estoy pudiendo resolver como hacer un UPDATE en una tabla calculando una resta de fechas con DATEDIFF (cuyos restandos están en la misma tabla), me explico en detalle:

Tengo una tabla con fecha_inicio, fecha_fin y diferencia_dias.
Necesito que para cada registro se calcule y guarde la diferencia_dias entre fecha_inicio y fecha_fin.

He intentado algo como:

Código:
UPDATE nombretabla SET diferencia_dias = DATEDIFF('d', fecha_inicio, fecha_fin)
pero no me funciona... :(

He visto varios ejemplos en internet (y mismo en este foro, pero con SELECT, no con UPDATE)... alguien que pueda darme una mano?


Saludos y gracias desde ya
__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
  #2 (permalink)  
Antiguo 08/06/2009, 22:22
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: UPDATE usando DateDiff

Que significa la 'd'?

creo que sin ese parametro, te debe funcionar bien.
Debes poner la fecha final como primer parametro y la inicial como segundo para obtener un numero positivo.

Código mysql:
Ver original
  1. UPDATE nombretabla SET diferencia_dias = DATEDIFF(fecha_fin, fecha_inicio)


Un saludo anarninque
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 09/06/2009, 06:30
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 18 años, 9 meses
Puntos: 28
Respuesta: UPDATE usando DateDiff

Gracias huesos52 por tu respuesta, te comento.
Acabo de probarlo así como me sugieres y me está dando un error de sintaxis

Alguien tiene idea o ha utilizado UPDATE con DATEDIFF que pueda darme una orientación?
Se escuchan ideas o sugerencias para probar...


Gracias y saludos!
__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
  #4 (permalink)  
Antiguo 09/06/2009, 06:35
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: UPDATE usando DateDiff

Describe que tipo de datos tienen las tablas.
Esa es la sintaxís correcta.

Donde te muestra el error?

Puedes poner un ejemplo con datos?

Yo acabo de probar y me funciona. Que versión de mysql trabajas?

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 09/06/2009, 06:44
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 18 años, 9 meses
Puntos: 28
Respuesta: UPDATE usando DateDiff

Gracias por responder nuevamente y tan rápido.

Te pongo 5 filas para que te hagas una idea de los datos (son todas muy similares):

Cita:
1 0000-00-00 00:00:00 0000-00-00 00:00:00 2007-04-23 00:00:00 [vacio] 0
2 0000-00-00 00:00:00 0000-00-00 00:00:00 2007-04-25 00:00:00 [vacio] 0
3 0000-00-00 00:00:00 0000-00-00 00:00:00 2007-04-30 00:00:00 [vacio] 0
4 0000-00-00 00:00:00 0000-00-00 00:00:00 2007-05-05 00:00:00 [vacio] 0
5 0000-00-00 00:00:00 0000-00-00 00:00:00 2007-05-04 00:00:00 [vacio] 0
La primer columna es una id, la segunda es una fua (fecha ultima actualización) aunque de momento esta en cero, pero no se incluye en esta resta de fechas.
La cuarta es un campo VARCHAR (que está en algunos registros vacíos pero no aprticipa tampoco).
Luego la columna 2 es fecha_fin y la 3 es fecha_inicio y la última está en cero pero es la que llevaría la resta (o sea es diferencia_dias)...

El error que me lanza es el siguiente:

Cita:
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '(fecha_fin, fecha_inicio)' at line 1
__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
  #6 (permalink)  
Antiguo 09/06/2009, 06:46
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 18 años, 9 meses
Puntos: 28
Respuesta: UPDATE usando DateDiff

A ver si así se entiende un poco mejor la estructura de la BBDD...

1 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | 2007-04-23 00:00:00 | [vacio] | 0
2 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | 2007-04-25 00:00:00 | [vacio] | 0
3 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | 2007-04-30 00:00:00 | [vacio] | 0
4 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | 2007-05-05 00:00:00 | [vacio] | 0
5 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | 2007-05-04 00:00:00 | [vacio] | 0
__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
  #7 (permalink)  
Antiguo 09/06/2009, 06:55
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: UPDATE usando DateDiff

Anarquique... no sabria que decirte.

Mira lo que yo he hecho y nunca me da error.

Código mysql:
Ver original
  1. mysql> create table anarquique(fecha_fin date, fecha_inicio date, numero_dias float);
  2. Query OK, 0 rows affected (0.16 sec)
  3.  
  4. mysql> insert into anarquique (fecha_fin,fecha_inicio) values(now(),'2009-01-01');
  5. Query OK, 1 row affected (0.05 sec)
  6.  
  7. mysql> insert into anarquique (fecha_fin,fecha_inicio) values('2009-12-31',now());
  8. Query OK, 1 row affected (0.00 sec)
  9.  
  10. mysql> select *from anarquique;
  11. +------------+--------------+-------------+
  12. | fecha_fin  | fecha_inicio | numero_dias |
  13. +------------+--------------+-------------+
  14. | 2009-06-09 | 2009-01-01   |        NULL |
  15. | 2009-12-31 | 2009-06-09   |        NULL |
  16. +------------+--------------+-------------+
  17. 2 rows in set (0.00 sec)
  18.  
  19. mysql> update anarquique set numero_dias=datediff(fecha_fin,fecha_inicio);
  20. Query OK, 2 rows affected (0.02 sec)
  21. Rows matched: 2  Changed: 2  Warnings: 0
  22.  
  23. mysql> select *from anarquique;
  24. +------------+--------------+-------------+
  25. | fecha_fin  | fecha_inicio | numero_dias |
  26. +------------+--------------+-------------+
  27. | 2009-06-09 | 2009-01-01   |         159 |
  28. | 2009-12-31 | 2009-06-09   |         205 |
  29. +------------+--------------+-------------+
  30. 2 rows in set (0.00 sec)
  31.  
  32. mysql> alter table anarquique fecha_inicio datetime;
  33. ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQ
  34. mysql> alter table anarquique modify fecha_inicio datetime;
  35. Query OK, 2 rows affected (0.16 sec)
  36. Records: 2  Duplicates: 0  Warnings: 0
  37.  
  38. mysql> alter table anarquique modify fecha_fin datetime;
  39. Query OK, 2 rows affected (0.02 sec)
  40. Records: 2  Duplicates: 0  Warnings: 0
  41.  
  42. mysql> update anarquique set numero_dias=datediff(fecha_fin,fecha_inicio);
  43. Query OK, 0 rows affected (0.00 sec)
  44. Rows matched: 2  Changed: 0  Warnings: 0
  45.  
  46. mysql> insert into anarquique (fecha_fin,fecha_inicio) values('0000-00-00 00:00:00','0000-00-00 00:00:00
  47. Query OK, 1 row affected (0.00 sec)
  48.  
  49. mysql> update anarquique set numero_dias=datediff(fecha_fin,fecha_inicio);
  50. Query OK, 0 rows affected (0.00 sec)
  51. Rows matched: 3  Changed: 0  Warnings: 0
  52.  
  53. mysql> select *from anarquique;
  54. +---------------------+---------------------+-------------+
  55. | fecha_fin           | fecha_inicio        | numero_dias |
  56. +---------------------+---------------------+-------------+
  57. | 2009-06-09 00:00:00 | 2009-01-01 00:00:00 |         159 |
  58. | 2009-12-31 00:00:00 | 2009-06-09 00:00:00 |         205 |
  59. | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |        NULL |
  60. +---------------------+---------------------+-------------+
  61. 3 rows in set (0.00 sec)
  62.  
  63. mysql> insert into anarquique (fecha_fin,fecha_inicio) values('0000-00-00 00:00:00',now());
  64. Query OK, 1 row affected (0.00 sec)
  65.  
  66. mysql> update anarquique set numero_dias=datediff(fecha_fin,fecha_inicio);
  67. Query OK, 0 rows affected (0.00 sec)
  68. Rows matched: 4  Changed: 0  Warnings: 0
  69.  
  70. mysql> select *from anarquique;
  71. +---------------------+---------------------+-------------+
  72. | fecha_fin           | fecha_inicio        | numero_dias |
  73. +---------------------+---------------------+-------------+
  74. | 2009-06-09 00:00:00 | 2009-01-01 00:00:00 |         159 |
  75. | 2009-12-31 00:00:00 | 2009-06-09 00:00:00 |         205 |
  76. | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |        NULL |
  77. | 0000-00-00 00:00:00 | 2009-06-09 07:50:11 |        NULL |
  78. +---------------------+---------------------+-------------+
  79. 4 rows in set (0.00 sec)
  80.  
  81. mysql> update anarquique set numero_dias=datediff(fecha_fin,fecha_inicio);
  82. Query OK, 0 rows affected (0.00 sec)
  83. Rows matched: 4  Changed: 0  Warnings: 0
  84.  
  85. mysql>

Asegurate que tanto fecha_fin como fecha_inicio sean tipo datetime, timestamp o date. Que numero_dias sea numerico (float, decimal) y no deberías tener problemas. Que versión de mysql usas?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 09/06/2009, 07:17
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 18 años, 9 meses
Puntos: 28
Respuesta: UPDATE usando DateDiff

Es extrañísimo.
Tanto fecha_fin como fecha_inicio son DATETIME y numero_dias era INT y ahora lo cambie a FLOAT.

La versión es 4.0.27.


Muchas gracias por todas las pruebas que estás haciendo para ayudarme!
__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
  #9 (permalink)  
Antiguo 09/06/2009, 07:29
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: UPDATE usando DateDiff

Parece ser que es la versión la que no permite hacer uso de datediff como función.
http://dev.mysql.com/doc/refman/4.1/...mmary-ref.html

En la documentación, entiendo que datediff está a partir de la versión 4.1.

No tengo como probar, pero no te funciona hacer una resta directamente?

Código mysql:
Ver original
  1. UPDATE nombretabla SET diferencia_dias = (fecha_fin - fecha_inicio)

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #10 (permalink)  
Antiguo 09/06/2009, 07:39
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 18 años, 9 meses
Puntos: 28
Respuesta: UPDATE usando DateDiff

No restandolo directamente no vale, se obtiene cualquier resultado ;)
Gracias de todos modos, veré si es posible actualizar la versión de MySQL, y sino pues no se, buscaré alguna otra forma de calcular la resta!

Muchas gracias por tu desinteresada ayuda!
__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
  #11 (permalink)  
Antiguo 09/06/2009, 07:49
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: UPDATE usando DateDiff

Anarquque..

Mirando un poco la documentación, y las posibles funciones que te pueden ayudar a realizar la resta, podrías hacer uso de to_days para realizar la resta y hacer la respectiva suma.

Prueba con esto:

Código mysql:
Ver original
  1. UPDATE nombretabla SET diferencia_dias = (to_days(fecha_fin) - to_days(fecha_inicio))

Esta función parece estar incluida desde la versión 3.23

Pruebala y nos cuentas
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #12 (permalink)  
Antiguo 09/06/2009, 07:57
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 18 años, 9 meses
Puntos: 28
Respuesta: UPDATE usando DateDiff

Wow, funcionó! :)
Me calcula perfectamente los que tienen fecha_inicio y fecha_fin distinto a cero, lo cuál es lógico.

Muchísimas gracias, has salvado mi martes! ;)
Y has dejado una excelente colaboración para FDW! Un abrazo!
__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
  #13 (permalink)  
Antiguo 09/06/2009, 07:59
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: UPDATE usando DateDiff

De nada.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
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 22:14.