powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
18 сообщений из 18, страница 1 из 1
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
    #39139115
Лысёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, прошу помощи. Специалистом в ИТ не являюсь, терминологией особо не владею, за что прошу извинить.

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

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

Таблица должна работать в режиме "реального времени", т.е. при достижении кем-то определенного возраста он автоматически должен переводится в соотв. возрастную категорию.
Как это сделать?
Буду благодарен за совет.
...
Рейтинг: 0 / 0
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
    #39139133
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы добавил еще одну небольшую табличку или создал небольшой сохраненный запрос с тремя полями: начало и конец возрастной категории и текст с назваеием категории. А зптем фулл джоин на таблицу. А можно и так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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, [ФИО]
...
Рейтинг: 0 / 0
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
    #39139171
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот поосторожнее надо с DateDiff в MS Access... скажем, справка для Access 2007 сообщает, что первый параметр "y" означает вовсе даже не годы, а "день года" (шоб я понимал, что это значит).

Так что лучше, используя DateAdd, отнимать от текущей даты необходимое количество лет (это, по крайней мере, работает корректно), а потом сравнивать.
...
Рейтинг: 0 / 0
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
    #39139172
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rivkin Dmitry, на пограничных возрастах запрос будет врать - переводить человека в следующий интервал, но день рождения ещё не наступил. Но если не принципиально...


Лысёк, пример с пользовательской функцией.
...
Рейтинг: 0 / 0
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
    #39139187
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
\\\\, с интервалами ошибочка...
...
Рейтинг: 0 / 0
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
    #39139200
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, с замечаниями согласен. Поспешил. Зациклился на решении... Надо бы DateDiff("yyyy"... но все равно не спасает на границвх, как отметил \\\\. Остался от решения только принцип доп таблицы...
...
Рейтинг: 0 / 0
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
    #39139234
Лысёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rivkin Dmitry, спасибо за совет. Я не спец, поэтому не знаю, где надо вводить этот код, который вы рекомендовали. Подскажите пожалуйста.
...
Рейтинг: 0 / 0
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
    #39139269
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лысёк,
Код надо бы скопировать в построитель запросов, соответственно изменив названия полей и таблиц на свои. Но, проблема в том, что он (код) не совсем точен (см замечания). Его надо править в соотвтествии с замечаниями и искать наиболее точное решение
...
Рейтинг: 0 / 0
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
    #39139285
Лысёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал таблицу: первое поле - название возрастного интервала, второе поле - возраст min, третье поле - возраст max. На этом застопорился. Как построить выражение, чтобы "возраст min" было равно "NOW" минус 15 лет и "возраст max" соответственно "NOW" минус 17 лет?
...
Рейтинг: 0 / 0
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
    #39139287
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поле "возраст min" в этом супе лишнее - у тебя же нет дырок?
...
Рейтинг: 0 / 0
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
    #39139294
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тебе вариант решения:
Добавь модуль.
Скопируй в него следующий код:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Public Function AgeCategory(BirthDate As Date) As Integer
Select Case BirthDate
Case Is > DateAdd("yyyy", -15, Date)
    AgeCategory = 1
Case Is > DateAdd("yyyy", -17, Date)
    AgeCategory = 2
Case Is > DateAdd("yyyy", -19, Date)
    AgeCategory = 3
Case Is > DateAdd("yyyy", -39, Date)
    AgeCategory = 4
Case Is > DateAdd("yyyy", -59, Date)
    AgeCategory = 5
Case Else
    AgeCategory = 6
End Select
End Function


Теперь в запросе можешь просто писать
Код: sql
1.
2.
SELECT [FIO],[BirthDate],AgeCategory([BirthDate]) AS [AgeCategory]
FROM [MyTable]


и в поле [AgeCategory] будешь получать номер (от 1 до 6), соответствующий категории человека на текущую дату.

PS. Сам бы за такое, наверное, удавил - но, во-первых, просто, во-вторых, при 240 записях пофиг.
...
Рейтинг: 0 / 0
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
    #39139311
Лысёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, спасибо, попробую
...
Рейтинг: 0 / 0
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
    #39139345
Лысёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, выдает ошибку синтаксиса
...
Рейтинг: 0 / 0
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
    #39139354
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лысёквыдает ошибку синтаксисаОчень содержательно.
Где именно?
...
Рейтинг: 0 / 0
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
    #39139367
Лысёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, в общем, модуль сохранился. С этим что делать SELECT [FIO],[BirthDate],AgeCategory([BirthDate]) AS [AgeCategory]
FROM [MyTable]
(первый раз создаю БД, так что ещё мало что понимаю)
...
Рейтинг: 0 / 0
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
    #39139376
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛысёкС этим что делать
Выберите вкладку "Создание".
Нажмите кнопку "Конструктор запросов".
Закройте окно выбора таблиц.
Наверху слева выберите "Режим SQL".
Сотрите весь текст.
Вставьте туда запрос, заменив название таблицы MyTable и имена полей FIO и BirthDate на свои.
Закройте его с сохранением.
Всё, можно открывать запрос и любоваться на итог.
...
Рейтинг: 0 / 0
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
    #39139387
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лысёк, готовые примеры не смотрим?
...
Рейтинг: 0 / 0
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
    #39139390
Лысёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, УРА!! Спасибо вам огромное!!!!
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]