Bazy danych

SQL - Wieczny kalendarz

<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