Это конкретный c расчет, потому что EGN
, похоже, является болгарским числом граждан. Важной частью для расчета является то, что первые шесть цифр соответствуют дате рождения, но номер месяца закодирован:
- для даты рождения между
01/01/1900
и 31/12/1999
месяц остается тем же - для даты рождения до того, как
01/01/1900
20
добавлено к месяцу, - для даты рождения между
01/01/2000
и 31/12/2099
, 40
добавлено к месяцу :
Возможен следующий подход:
Таблица:
CREATE TABLE Data (egn varchar(10))
INSERT INTO Data (egn) VALUES ('8607051914')
Таблица:
SELECT
egn,
CASE
WHEN 0 <= age AND age < 18 THEN '0-18'
WHEN 18 <= age AND age < 30 THEN '18-30'
WHEN 30 <= age AND age < 40 THEN '30-40'
ELSE '40+'
END AS age
FROM (
SELECT
egn,
DATEDIFF(
year,
DATEFROMPARTS(
CASE
WHEN SUBSTRING(egn, 3, 2) BETWEEN '21' AND '32' THEN '18' + SUBSTRING(egn, 1, 2)
WHEN SUBSTRING(egn, 3, 2) BETWEEN '41' AND '52' THEN '20' + SUBSTRING(egn, 1, 2)
ELSE '19' + SUBSTRING(egn, 1, 2) END,
CASE
WHEN SUBSTRING(egn, 3, 2) BETWEEN '21' AND '32' THEN SUBSTRING(egn, 3, 2) - 20
WHEN SUBSTRING(egn, 3, 2) BETWEEN '41' AND '52' THEN SUBSTRING(egn, 3, 2) - 40
ELSE SUBSTRING(egn, 3, 2) END,
SUBSTRING(egn, 5, 2)
),
GETDATE()
) AS age
FROM Data
) t
Результат:
egn age
8607051914 30-40