Pchełki SQL: leniwe przestępne

Zaskakująco prosta metoda na sprawdzenie przestępności roku.

Pisałem kiedyś o latach przestępnych: skąd się wzięły, na czym polegają i tak dalej.

Algo-rytm prze-stęp-NY

Dziś szybciutko o bardzo prostym, a zarazem bardzo efektownym sposobie sprawdzenia, czy dany rok jest przestępny czy nie. Za pomocą języka SQL!

W klasycznym podejściu sprawdzilibyśmy, czy numer roku dzieli się przez cztery, przez sto i przez czterysta, i na tej bazie skonstruowalibyśmy zgrabny i (względnie) prosty algorytm.

Ja jednak jestem leniwy, dlatego skorzystam z drogi na skróty:

Rok przestępny to taki rok, który ma 366 dni, prawda?
Ten dodatkowy dzień to oczywiście 29 lutego.
Wystarczy więc sprawdzić, czy w danym roku występuje 29 lutego – i gotowe!

Oczywiście jest to podejście wybitnie nieeleganckie: zwalamy całą brudną robotę na silnik bazy danych, który przecież „wie” czy dany rok jest przestępny. Zero elegancji.

Ale działa…

Zróbmy prosty test; sprawdzimy które lata z przedziału 1900 – 2500 są przestępne:

SET NOCOUNT ON
DECLARE @year INT = 1900
DECLARE @t TABLE (y VARCHAR(4))
WHILE @year < 2500
BEGIN
    INSERT @t
    SELECT @year
    WHERE ISDATE(CAST(@year AS CHAR(4)) + '0229') = 1
    SET @year += 1
END

SELECT STUFF((SELECT ', ' + y FROM @t FOR XML PATH('')), 1, 2, '')

Wynik:

1904, 1908, 1912, 1916, 1920, 1924, 1928, 1932, 1936, 1940, 1944, 1948, 1952, 1956, 1960, 1964, 1968, 1972, 1976, 1980, 1984, 1988, 1992, 1996, 2000, 2004, 2008, 2012, 2016, 2020, 2024, 2028, 2032, 2036, 2040, 2044, 2048, 2052, 2056, 2060, 2064, 2068, 2072, 2076, 2080, 2084, 2088, 2092, 2096, 2104, 2108, 2112, 2116, 2120, 2124, 2128, 2132, 2136, 2140, 2144, 2148, 2152, 2156, 2160, 2164, 2168, 2172, 2176, 2180, 2184, 2188, 2192, 2196, 2204, 2208, 2212, 2216, 2220, 2224, 2228, 2232, 2236, 2240, 2244, 2248, 2252, 2256, 2260, 2264, 2268, 2272, 2276, 2280, 2284, 2288, 2292, 2296, 2304, 2308, 2312, 2316, 2320, 2324, 2328, 2332, 2336, 2340, 2344, 2348, 2352, 2356, 2360, 2364, 2368, 2372, 2376, 2380, 2384, 2388, 2392, 2396, 2400, 2404, 2408, 2412, 2416, 2420, 2424, 2428, 2432, 2436, 2440, 2444, 2448, 2452, 2456, 2460, 2464, 2468, 2472, 2476, 2480, 2484, 2488, 2492, 2496

Jak widać system działa bez pudła. Wymienione są wszystkie lata podzielne przez 4, z wyjątkiem podzielnych przez 100, no chyba że dzielą się przez 400…

Proste?

No ba.

Autor: xpil

Po czterdziestce. Żonaty. Dzieciaty. Komputerowiec. Krwiodawca. Emigrant. Rusofil. Lemofil. Sarkastyczny. Uparty. Mól książkowy. Ateista. Apolityczny. Nie oglądam TV. Uwielbiam matematykę. Walę prosto z mostu. Gram na paru instrumentach. Lubię planszówki. Słucham bluesa, poezji śpiewanej i kapel a’capella. || Kliknij tutaj po więcej szczegółów ||

Dodaj komentarz

5 komentarzy do "Pchełki SQL: leniwe przestępne"

Powiadom o
avatar
Sortuj wg:   najnowszy | najstarszy | oceniany
Rzast
Gość

Mała korekta:
w tekście (zaraz przed komendą SQL) piszesz, że od 1950, a sprawdzasz od 1900.
A teraz szybciutko kawusię i poprawiać 😉

Butter
Gość

bruforce? a fe ;))

Polak we Francji
Gość

Troche zabawne.Praktyczne. Kiedys mnie programowanie odrobine interesowalo. SQL sie przydaje.

wpDiscuz