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

 

Kimberley said:

Majte na písanie, skvelú prácu!

listopadu 5, 2014 1:22
 

Salting said:

These re-wholesalers would like the original investor to make as little as possible because they are only able to mark the property up so much to re-sell it.

They are soo designed that they hugg and fit your face

perfecttly well, and do not slip off easily, even while you are performing the most aggressive kind off physical activities.

If you want to boost and improve your reputation, you have to

look for a reliable wholesaler.

prosince 13, 2014 18:59
 

χτενισματα για μακρια μαλλια 2013 said:

Just desire too say your article is as astounding. The clearness in your post iss just

cool and i can assume you're an expert on this subject.

Fine with your permission allow me tto grab your feed to keep up to date with forthcoming post.

Thanks a million and please carry on the gratifying work.

února 15, 2017 18:09
 

pressamallion.wordpress.com said:

Thank you, I've just been looking for info about this subject forr a long time and yours is the

grwatest I have came pon til now. But, whawt about the conclusion? Are you positive about

the supply?

dubna 4, 2017 7:36

Leave a Comment

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