Cześć,
Chciałbym napisać funkcję liczącą wiek, wyglądającą tak: create function NazwaFunkcji @DataUrodzenia date, @DataStart date, @DataEnd date
Czyli podaję datę urodzenia, a parametry DataStart i DataEnd są przedziałem, dla którego funkcja sprawdza ile lat kończy klient w tym przedziale.
Dla przykładu:
select NazwaFunkcji (1985-01-01,2021-03-01,2021-03-31) - czuli sprawdzamy ile lat klient skończy w przedziale dat 2021-03-01,2021-03-31.
O ile nie mam problemu z obliczeniem wieku podając datę urodzenia i bieżącą to jednak nie mam pomysłu jak ugryźć ten przedział. Prośba o pomoc w napisaniu selecta - z obraniem w funkcję już sobie poradzę.
Z góry dzięki
- Rejestracja:ponad 7 lat
- Ostatnio:ponad 3 lata
- Postów:33

- Rejestracja:prawie 17 lat
- Ostatnio:dzień
- Postów:2792
Sprawdzasz, ile ma lat na koniec przedziału. Potem sprawdzasz, ile ma lat na początek przedziału. Jeśli to jest ta sama liczba, to znaczy, że w tym przedziale nie mial urodzin. Zwracasz większą z tych dwóch liczb.
- Rejestracja:ponad 6 lat
- Ostatnio:4 dni
- Postów:3561
Ja bym liczył na kliencie.
Tu serwer bazy niczego nie zoptymalizuje.
Update: zwłaszcza, że "wiek wg ustawy nr 1" jest inny niż "wiek wg ustawy nr 2"

- Rejestracja:ponad 17 lat
- Ostatnio:około 2 godziny
- Postów:1595
Ja nie do końca rozumiem sens sprawdzania wieku w przedziale ... w zależności od parametrów możesz dostać 1 lub 2 wyniki i w taki sposób będziesz musiał to zobrazować. @Marcin.Miga w zasadzie podał Ci rozwiązanie natomiast od Siebie dodam, że sprawdzenie lat między dwoma datami robisz tak:
https://www.w3schools.com/sql/func_sqlserver_datediff.asp
- Rejestracja:ponad 7 lat
- Ostatnio:ponad 3 lata
- Postów:33
Sens sprawdzania wieku w podanym przedziale wynika z potrzeby biznesowej. Otóż, biznes chce sprawdzić czy np w miesiącu marcu istnieje klient, który kończy 50 lat. Jeżeli tak to pobierają jego dane i sobie działają co potrzebują. Dokładnie - właśnie wojuję z podpowiedzą @Marcin.Miga. Funkcję datediff znam, ale niestety w swojej prostej formie mi nie pomoże.

- Rejestracja:ponad 17 lat
- Ostatnio:około 2 godziny
- Postów:1595
Jak chcesz sprawdzać kwartał lub inny przedział niż mc to niestety bez 2 parametrów będzie ciężko i wtedy robię tak:
select max(s.dt) from
(select datediff(hour, '1985-01-01', '2021-03-01') / 8766 dt
union
select datediff(hour, '1985-01-01', '2021-03-31') / 8766 dt )s
To jest oczywiście z uwzględnieniem dnia
Natomiast jeśli ma to być tylko w przedziale miesiąca to 1 dzień miesiąca zawsze jest 1, a ostatni dzień mc wyliczasz tak:
DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE()), -1)
- Rejestracja:ponad 22 lata
- Ostatnio:40 minut
- Postów:3866
Sens sprawdzania wieku w podanym przedziale wynika z potrzeby biznesowej. Otóż, biznes chce sprawdzić czy np w miesiącu marcu istnieje klient, który kończy 50 lat
A to nie mozna w where
bez funkcji:
select * from t
where
dateadd(year,50,dataurodzenia) between '2020-03-01' and '2020-03-31'