Zine.net online

Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc
w Szukaj

arkadiusz.wasniewski

Określanie dnia tygodnia z pogardą dla DATEFIRST

Do szału doprowadza mnie określanie dnia tygodnia w MS SQL. Zmiany ustawienia domyślnego pierwszego dnia tygodnia z niedzieli na poniedziałek nie są ustawiane globalnie dla bazy (chyba, że o czymś nie wiem) i nie mogą być wywoływane np. w funkcjach użytkownikach. Jedne zapytania wywoływane są w Reporting Services, inne w Integration Services, inne jeszcze gdzie indziej. Szału można dostać. Stąd pomysł na poniższy kod, który zwraca dnie tygodnia numerując je od cyfry jeden:

    CREATE FUNCTION GetDayOfWeek

    (

        @Value datetime

    )

    RETURNS tinyint

    AS

    BEGIN

        RETURN DATEDIFF(day, '1753-01-01', @Value) % 7 + 1

    END

Funkcja DATEDIFF z parametrem day zwraca liczbę dni pomiędzy minimalną dopuszczalną datą dla typu datetime a datą podaną parametrem @Value. Dzielenie modulo określa, który dzień tygodnia. Musimy dodać wartość jeden, ponieważ 1 stycznia 1753 roku to poniedziałek, w związku z czym różnica pomiędzy poniedziałkiem a poniedziałkiem z @Value jest zero, a my dla poniedziałku oczekujemy liczby jeden.

Opublikowane 17 stycznia 2008 11:47 przez arkadiusz.wasniewski
Filed under: ,

Powiadamianie o komentarzach

Jeżeli chciałbyś otrzymywać email gdy ta wypowiedź zostanie zaktualizowana, to zarejestruj się tutaj

Subskrybuj komentarze za pomocą RSS

Komentarze:

 

brejk said:

Szału można też dostać z samą funkcją DATEDIFF, bo ma "zahardcode'owaną" niedzielę jako pierwszy dzień tygodnia i jest nieczuła na DATEFIRST :-) By design oczywiście (chodziło o to, żeby DATEDIFF była funkcją deterministyczną).

BTW, zamiast daty '17530101' możesz podać 0 (int) i też jest ok. Sugerowałbym unikania formatu 'RRRR-MM-DD' przy podawaniu dat przez varchar, bo MM i DD czasem mogą być zamienione znaczeniami (decyduje o tym ustawienie językowe połączenia).

stycznia 17, 2008 14:44
 

arkadiusz.wasniewski said:

Patentu z zerem nie znałem. Działa super. Dzięki za uwagi. Zawsze można się czegoś douczyć dzięki taki wpisom. :-D

Arek

PS. Inny szał to numerowanie tygodni w standardzie ISO 8601.

stycznia 17, 2008 14:56
 

arkadiusz.wasniewski said:

Kojarzę, iż gdzieś na wss.pl była dyskusja (zresztą też w niej brałeś udział) na temat koszmaru niektórych f-cji determistycznych.

stycznia 17, 2008 15:00
 

brejk said:

O tak, były takie dyskusje. Zgłosiłem zachowanie DATEDIFF jako błąd na connect. I mimo, że zamknęli buga i napisali, że "by design", to ja ciągle jestem zdania, że pójście w stronę deterministyczności funkcji kosztem jej poprawnego działania jest co najmniej kontrowersyjne.

stycznia 17, 2008 15:06

Co o tym myślisz?

(wymagane) 
(opcjonalne)
(wymagane) 

  
Wprowadź kod: (wymagane)
Wyślij
W oparciu o Community Server (Personal Edition), Telligent Systems