Obliczanie wieku T-SQL

0

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

2

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.

1

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"

1

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

0

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.

1

No ok ale zmierzam do tego, że aby sprawdzić czy w mc marcu ktoś ma 50 nie potrzebujesz 2 parametrów od do. Można to zrobić sprytniej :) Chyba, że chodzi o np podanie kwartału

0

W sumie już prawie to ogarnąłem podając 2 parametry ( a nie 3 jak pisałem w poście). A jak Ty byś to zrobił? :)

1

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)
0

No i fajnie, dzięki za pomoc!

1

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'

1 użytkowników online, w tym zalogowanych: 0, gości: 1