V MS SQL Serveru (např. při použití funkce datepart(weekday, '2007-11-07') ) se pracuje s číslem dne v týdnu.
Toto číslo však může být různé v závislosti na tom, jaký má váš SQL server nastaven první den v týdnu
(pomocí SET DATEFIRST resp. zjištění pomocí PRINT @@DATEFIRST).
Např. v českém číslování (datefirst=1) je
pondělí = 1
...
sobota = 6
neděle = 7
Kdežto v anglickém číslování (datefirst=7, SQL Server default) je
pondělí = 2
...
sobota = 7
neděle = 1
Jenže co když chcete i v anglickém nastavení SQL Serveru použí algoritmus, který počítá s českým číslováním?
Nabízí se před spuštěním algoritmu nastavit české číslování pomocí SET DATEFIRST a po ukončení zase zpět na anglické.
Ale příkaz SET není povoleno použít uvnitř uživatelem definované funkce. Navíc by programátor mohl opomenout vrátit číslování zpět a mohlo by to rozhodit zbytek programu (nastavení SET DATEFIRST trvá po dobu jedné relace se SQL serverem)
Proto je zde funkce ConvertDayOfWeek, která hodnotu dne v týdnu bezpečně převede z jednoho číslování na druhé.
Příklady volání:
------------------------------------------------------------
-- 2 - úterý
-- 1 - české
-- převeď
-- 7 - do anglického
PRINT
dbo.ConvertDayOfWeek(2, 1, 7)
-- vrací 3 (anglické úterý)
------------------------------------------------------------
-- den '2007-11-07' (což je středa)
-- v číslování aktuálně platném v SQL serveru
-- převeď do českého
PRINT
dbo.ConvertDayOfWeek(datepart(weekday, '2007-11-07'), @@DATEFIRST, 1)
-- vrací 3 (česká středa)
Imlementace:
--------------------------------------------------------
-- ConvertDayOfWeek
--------------------------------------------------------
-- Converts day of week (number from interval 1..7)
-- that uses @src_datefirst as first date of week
-- to day of week that uses given @target_datefirst.
-- If some argument is null or out of range, returns null.
-- Advice: pass SQL Server variable @@DATEFIRST as one of arguments
CREATE FUNCTION dbo.ConvertDayOfWeek
(
@src_day_of_week int, -- day of week value (from interval 1..7)
@src_datefirst int, -- which day should be 1st day of week (1=Monday, 2=Tuesday .. 7=Sunday)
@target_datefirst int -- which day should be 1st day of week (1=Monday, 2=Tuesday .. 7=Sunday)
)
RETURNS int -- target day of week value (from interval 1..7)
AS
BEGIN
-- check input arguments
IF @src_day_of_week IS NULL OR @target_datefirst IS NULL
RETURN NULL
IF NOT @src_day_of_week BETWEEN 1 AND 7
RETURN NULL
IF NOT @target_datefirst BETWEEN 1 AND 7
RETURN NULL
DECLARE @ret int
-- note: added 7 ensures that the modulo is computed on positive value
SET @ret = (7 + @src_day_of_week + @src_datefirst - @target_datefirst) % 7
IF @ret = 0 SET @ret = 7
RETURN @ret
END
GO