Okej, więc mam raport, który porównuje ten tydzień do zeszłego tygodnia, a nasz klient zauważył, że ich dane były „funky”. Po dalszym dochodzeniu ustaliliśmy, że tygodnie nie przebiegały prawidłowo zgodnie ze standardami ISO. Uruchomiłem ten skrypt jako przypadek testowy.
SET DATEFIRST 1
SELECT DATEPART(WEEK, '3/26/13')
, DATEPART(WEEK, '3/27/12')
, DATEPART(WEEK, '3/20/12')
, DATEPART(WEEK, '1/2/12')
SELECT DATEPART(ISO_WEEK, '3/26/13')
, DATEPART(ISO_WEEK, '3/27/12')
, DATEPART(ISO_WEEK, '3/20/12')
, DATEPART(ISO_WEEK, '1/2/12')
Po uruchomieniu otrzymałem te wyniki.
Pomyślałem, że to dziwne, więc zacząłem więcej kopać i odkryłem, że SQL Server liczy 1 stycznia jako pierwszy tydzień roku, a ISO liczy pierwszą niedzielę stycznia jako pierwszy tydzień roku.
Pytanie kończy się podwójnie. Pytanie 1 dlaczego to jest? Pytanie 2 czy jest jakiś sposób, aby to zmienić, więc nie muszę modyfikować całego mojego kodu, aby używać go ISO_Week
wszędzie?
Istnieje kilka organów przyjmujących różne warunki w pierwszym tygodniu roku. Niektórzy zakładają, że pierwszy dzień tygodnia rozpoczyna się w pierwszym tygodniu, ale najczęstszym pomysłem jest to, że pierwszy tydzień, który ma pierwszy czwartek, jest pierwszym tygodniem roku.
Tak
ISO_WEEK
zgadza się, że i tak jak w 2010, 2011 lub 2012, jak można sprawdzić, czyISO_WEEK
mówi 01 stycznia jest 52-ty lub 53-gi tygodniu podczasWEEK
lubWK
lubWW
mówi, że są w pierwszym tygodniu.źródło