Weblog @ rebex.cz

Weblogy na webu Rebexu
Welcome to Weblog @ rebex.cz Sign in | Help
in Search

Weblog @ Rebex.cz :: Honza Šotola

nepravidelné poznámky .NET vývojáře

Převod mezi dny v týdnu v MS SQL Serveru

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
Published 7. listopadu 2007 6:57 by honzas
Filed under:

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

No Comments

Leave a Comment

(required) 
(optional)
(required) 
Submit
Powered by Community Server (Personal Edition), by Telligent Systems