Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной

Лысёк
Дата: 28.12.2015 10:21:24
Здравствуйте, прошу помощи. Специалистом в ИТ не являюсь, терминологией особо не владею, за что прошу извинить.

Имеется таблица с 240 строками. В каждой строке одного поля обозначено ФИО человека в текстовом типе данных, а в соседнем поле для каждого указана дата рождения (тип данных дата/время).
Требуется, чтобы программа, используя разницу между текущей датой и датой рождения, рассортировала все 240 чел. по 6-и возрастным категориям:

0 - 14 лет
15 - 17 лет
18 - 19 лет
20 - 39 лет
40 - 59 лет
60 лет и страше

Таблица должна работать в режиме "реального времени", т.е. при достижении кем-то определенного возраста он автоматически должен переводится в соотв. возрастную категорию.
Как это сделать?
Буду благодарен за совет.
Rivkin Dmitry
Дата: 28.12.2015 11:00:10
Я бы добавил еще одну небольшую табличку или создал небольшой сохраненный запрос с тремя полями: начало и конец возрастной категории и текст с назваеием категории. А зптем фулл джоин на таблицу. А можно и так:

select [ФИО], [Birthday], Category
from MyTable, (
SELECT top 1 0 as BeginCat, 14 as EndCat, "0 - 14" as Category
FROM MSysObjects
union
SELECT top 1 15 as BeginCat, 17  as EndCat, "15 - 17" as Category
FROM MSysObjects
union
SELECT top 1 18  as BeginCat, 19 as EndCat, "18 - 19" as Category
FROM MSysObjects
union
SELECT top 1 20 as BeginCat, 39 as EndCat, "20 - 39" as Category
FROM MSysObjects
union
SELECT top 1 40 as BeginCat, 59 as EndCat, "40 - 59" as Category
FROM MSysObjects
union
SELECT top 1 60 as BeginCat, 120 as EndCat, "60 +" as Category
FROM MSysObjects
) as t
where Datediff("y", Birthday, Date) >= BeginCat and  Datediff("y", Birthday, Date) < EndCat
order by BeginCat, [ФИО]
Akina
Дата: 28.12.2015 11:47:51
Вот поосторожнее надо с DateDiff в MS Access... скажем, справка для Access 2007 сообщает, что первый параметр "y" означает вовсе даже не годы, а "день года" (шоб я понимал, что это значит).

Так что лучше, используя DateAdd, отнимать от текущей даты необходимое количество лет (это, по крайней мере, работает корректно), а потом сравнивать.
\\\\
Дата: 28.12.2015 11:49:08
Rivkin Dmitry, на пограничных возрастах запрос будет врать - переводить человека в следующий интервал, но день рождения ещё не наступил. Но если не принципиально...


Лысёк, пример с пользовательской функцией.
\\\\
Дата: 28.12.2015 11:54:17
\\\\, с интервалами ошибочка...
Rivkin Dmitry
Дата: 28.12.2015 12:13:56
Да, с замечаниями согласен. Поспешил. Зациклился на решении... Надо бы DateDiff("yyyy"... но все равно не спасает на границвх, как отметил \\\\. Остался от решения только принцип доп таблицы...
Лысёк
Дата: 28.12.2015 12:55:50
Rivkin Dmitry, спасибо за совет. Я не спец, поэтому не знаю, где надо вводить этот код, который вы рекомендовали. Подскажите пожалуйста.
Rivkin Dmitry
Дата: 28.12.2015 13:34:05
Лысёк,
Код надо бы скопировать в построитель запросов, соответственно изменив названия полей и таблиц на свои. Но, проблема в том, что он (код) не совсем точен (см замечания). Его надо править в соотвтествии с замечаниями и искать наиболее точное решение
Лысёк
Дата: 28.12.2015 13:47:08
Сделал таблицу: первое поле - название возрастного интервала, второе поле - возраст min, третье поле - возраст max. На этом застопорился. Как построить выражение, чтобы "возраст min" было равно "NOW" минус 15 лет и "возраст max" соответственно "NOW" минус 17 лет?
Akina
Дата: 28.12.2015 13:52:30
Поле "возраст min" в этом супе лишнее - у тебя же нет дырок?