SQL - Wieczny kalendarz
lechert
<right>Łukasz Lechert</right>
Funkcja WiecznyKalendarz oblicza numer kolejnego dnia tygodnia na podstawie zadanego roku, miesiąc i dnia.
Przyklad: Sylwester w 2007: poniedziałek
Wyniki: 0 - niedziela, 1 - poniedziałek, ... , 6 - sobota
Algorytm Mikea Keitha:
dzień tygodnia = ([23m/9] + d + 4 + y + [z/4] - [z/100] + [z/400] - 2 (if m >= 3) ) mod 7
gdzie
[ ] oznacza dzielenie bez reszty z zaokrągleniem w dól
mod - funkcja modulo
m - numer miesiąca (od stycznia = 1 do grudnia = 12)
d - numer dnia miesiąca
z = y - 1 jeśli m < 3,
z = y w pozostałych przypadkach
SELECT [master].[dbo].[TestWiecznyKalendarz] (
2007
,1
,31)
CREATE FUNCTION TestWiecznyKalendarz(@rok AS INTEGER, @miesiac AS INTEGER, @dzien AS INTEGER)
RETURNS INTEGER
AS
BEGIN
DECLARE @RetValue AS INTEGER
SET @RetValue = dbo.WiecznyKalendarz(@rok, @miesiac, @dzien)
RETURN @RetValue
END
CREATE FUNCTION WiecznyKalendarz(@y AS INTEGER, @m AS INTEGER, @d AS INTEGER)
RETURNS INTEGER
AS
BEGIN
DECLARE @h AS INTEGER
DECLARE @i AS INTEGER
IF @m < 3
BEGIN
SET @i = 0;
SET @h = @y - 1
END
ELSE
BEGIN
SET @i = 2;
SET @h = @y;
END
RETURN (ROUND(23 * @m / 9, 0, 1) + @d + 4 + @y + ROUND(@h / 4, 0 , 1) - ROUND(@h / 100, 0 , 1) + ROUND(@h / 400, 0 , 1) - @i) % 7
END