2010-10-18 25 views
7

Necesito calcular las semanas de una fecha en mi declaración de selección de MySQL. Hay una columna de fecha en una de las tablas, y necesito calcular cuántas semanas falta la fecha.MySQL: ¿Cómo calcular semanas a partir de una fecha específica?

SELECT EventDate, (calculation) AS WeeksOut FROM Events; 

Ejemplo:

  • 6 días de distancia, semanas fuera = 0
  • 7 días de distancia, semanas fuera = 1
  • 13 días de distancia, semanas OUT = 1
  • 14 días lejos, semanas fuera = 2
+0

¿Qué desea hacer por semanas parciales? Por ejemplo: ¿deberían 3.2857 semanas ser 3 semanas, 4 semanas o algo intermedio? –

+0

Sí, debe redondearse a la semana entera más cercana – Andrew

Respuesta

17

Utilice DATEDIFF function:

ROUND(DATEDIFF(end_date, start_date)/7, 0) AS weeksout 

El problema con WEEKS es que no arrojará los resultados correctos para las fechas que cruzan el 1 de enero.

El 0 es el número de lugares decimales que se utilizará en la función ROUND.

+1

+1 Buen punto en la emisión del año nuevo, no había pensado en eso ... –

+0

Más uno Pero puede agregar el enlace a la documentación para obtener mejores explicaciones. ¿Por qué el 0 después del 7? –

+1

@JohnMax: Información agregada sobre el 0 –

3

He aquí una forma sencilla de hacerlo:

SELECT EventDate, (week(EventDate) - week(curdate())) AS WeeksOut FROM Events; 

Ejemplo:

mysql> select week('2010-11-18') - week ('2010-10-18'); 
+------------------------------------------+ 
| week('2010-11-18') - week ('2010-10-18') | 
+------------------------------------------+ 
|          4 | 
+------------------------------------------+ 
1 row in set (0.00 sec) 

Otra opción es calcular el intervalo en días y se divide por 7:

SELECT EventDate, datediff(EventDate,curdate())/7 AS WeeksOut FROM Events; 

Ejemplo:

mysql> select datediff('2010-11-18' , '2010-10-18')/7; 
+-------------------------------------------+ 
| datediff('2010-11-18' , '2010-10-18')/7 | 
+-------------------------------------------+ 
|         4.4286 | 
+-------------------------------------------+ 
1 row in set (0.00 sec) 
+0

Buena explicación +1 de mi parte – w3uiguru

2

Con el fin de superar el problema del "Año Nuevo" y todavía desea utilizar WEEK(), encontré el siguiente método bastante eficaz.

SELECT 
    YEAR(end_date)*52+WEEK(end_date) 
    - YEAR(start_date)*52 - WEEK(start_date) as weeks_out 
FROM 
    events; 

La diferencia con este método (en comparación con el método DATEDIFF) es que está alineada con la semana. Así que hoy (que es lunes) y el último viernes devolvería 1 usando este método, pero devolvería 0 con el método DATEDIFF

Cuestiones relacionadas