Mysql
 sql >> Database >  >> RDS >> Mysql

SQL:Dove tra due date senza anno?

Il modo migliore per pensare a questo problema è convertire le date in un numero compreso tra 0 e 365 corrispondente al giorno dell'anno. Quindi, semplicemente scegliendo le date in cui questa differenza è inferiore a 14, avrai la tua finestra di due settimane.

Che si romperà all'inizio o alla fine dell'anno. Ma la semplice aritmetica modulare ti dà la risposta.

Fortunatamente, MySQL ha DAYOFYEAR(date) , quindi non è così complicato:

SELECT * FROM tbl t
WHERE 
  MOD(DAYOFYEAR(currdate) - DAYOFYEAR(t.the_date) + 365, 365) <= 14
  OR MOD(DAYOFYEAR(t.the_date) - DAYOFYEAR(currdate) + 365, 365) <= 14

Quel + 365 in più è necessario poiché la MOD di MySQL restituirà numeri negativi.

Questa risposta non tiene conto correttamente degli anni bisestili. Se l'anno in corso non è bisestile e il currdate è entro 14 giorni dalla fine dell'anno, allora ti perderai un giorno in gennaio che avresti dovuto includere. Se ti interessa, dovresti sostituire 365 con [the number of days in the year - 1 ].