Najlepszym sposobem myślenia o tym problemie jest przekonwertowanie dat na liczbę od 0 do 365, odpowiadającą dniu w roku. Następnie po prostu wybierając daty, w których różnica jest mniejsza niż 14, otrzymujesz dwutygodniowe okno.
To się załamie na początku lub pod koniec roku. Ale prosta arytmetyka modularna daje odpowiedź.
Na szczęście MySQL ma DAYOFYEAR(date)
, więc nie jest to takie skomplikowane:
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
Te dodatkowe + 365
jest to potrzebne, ponieważ MOD MySQL zwróci liczby ujemne.
Ta odpowiedź nie uwzględnia prawidłowo lat przestępnych. Jeśli bieżący rok nie jest rokiem przestępnym, a aktualny dzień przypada w ciągu 14 dni od końca roku, przegapisz jeden dzień w styczniu, który powinieneś uwzględnić. Jeśli Ci na tym zależy, powinieneś wymienić 365
z [the number of days in the year - 1
].