MySQL: Come calcolare settimane fuori da una data specifica?
-
08-10-2019 - |
Domanda
Ho bisogno di calcolare le settimane fuori da una data nel mio MySQL select. C'è una colonna di data in uno dei tavoli, e ho bisogno di calcolare quanti settimane di distanza la data è.
SELECT EventDate, (calculation) AS WeeksOut FROM Events;
Esempio:
- 6 giorni di distanza, settimane out = 0
- 7 giorni di distanza, settimane out = 1
- 13 giorni di distanza, settimane out = 1
- 14 giorni di distanza, settimane out = 2
Soluzione
Utilizzare la funzione di href="http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_datediff" rel="nofollow DATEDIFF :
ROUND(DATEDIFF(end_date, start_date)/7, 0) AS weeksout
Il problema con SETTIMANE è che non restituisca risultati corretti per le date che si incrociano 1 ° gennaio.
Il 0
è il numero di cifre decimali da utilizzare nel ROUND
funzione.
Altri suggerimenti
Ecco un modo semplice per farlo:
SELECT EventDate, (week(EventDate) - week(curdate())) AS WeeksOut FROM Events;
Esempio:
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)
Un'altra opzione è quella di calcolare l'intervallo in giorni e dividere per 7:
SELECT EventDate, datediff(EventDate,curdate())/7 AS WeeksOut FROM Events;
Esempio:
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)
Al fine di superare l'intera questione "Anno Nuovo" e si vuole ancora utilizzare WEEK()
, ho trovato il seguente metodo molto efficace.
SELECT
YEAR(end_date)*52+WEEK(end_date)
- YEAR(start_date)*52 - WEEK(start_date) as weeks_out
FROM
events;
La differenza con questo metodo (a differenza del metodo DATEDIFF
) è che esso sia allineato con la settimana. Così oggi (che è Lunedi) e Venerdì scorso sarebbero tornati 1
con questo metodo, ma sarebbero tornati 0
con il metodo DATEDIFF