Home / Pchełki / Pchełki SQL: leniwe przestępne

Pchełki SQL: leniwe przestępne

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.


About 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 ||

Check Also

Pchełki VBA: rysujemy spiralę Ulama w Excelu

Czytelnicy piszą, redakcja odpowiada, czyli jak za pomocą całkiem paskudnego kodu VBA narysować w Excelu spiralę Ulama.

5
Dodaj komentarz

avatar
3 Comment threads
2 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
4 Comment authors
Polak we FrancjiButterxpilRzast Recent comment authors
  Subscribe  
najnowszy najstarszy oceniany
Powiadom o
Rzast
Gość
Rzast

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ść
Butter

bruforce? a fe ;))

Polak we Francji
Gość

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

%d bloggers like this: