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

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

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

Таблица должна работать в режиме "реального времени", т.е. при достижении кем-то определенного возраста он автоматически должен переводится в соотв. возрастную категорию.
Как это сделать?
Буду благодарен за совет.
...
Рейтинг: 0 / 0
28.12.2015, 11:00
    #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
28.12.2015, 11:47
    #39139171
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
Вот поосторожнее надо с DateDiff в MS Access... скажем, справка для Access 2007 сообщает, что первый параметр "y" означает вовсе даже не годы, а "день года" (шоб я понимал, что это значит).

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


Лысёк, пример с пользовательской функцией.
...
Рейтинг: 0 / 0
28.12.2015, 11:54
    #39139187
\\\\
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
\\\\, с интервалами ошибочка...
...
Рейтинг: 0 / 0
28.12.2015, 12:13
    #39139200
Rivkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
Да, с замечаниями согласен. Поспешил. Зациклился на решении... Надо бы DateDiff("yyyy"... но все равно не спасает на границвх, как отметил \\\\. Остался от решения только принцип доп таблицы...
...
Рейтинг: 0 / 0
28.12.2015, 12:55
    #39139234
Лысёк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
Rivkin Dmitry, спасибо за совет. Я не спец, поэтому не знаю, где надо вводить этот код, который вы рекомендовали. Подскажите пожалуйста.
...
Рейтинг: 0 / 0
28.12.2015, 13:34
    #39139269
Rivkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
Лысёк,
Код надо бы скопировать в построитель запросов, соответственно изменив названия полей и таблиц на свои. Но, проблема в том, что он (код) не совсем точен (см замечания). Его надо править в соотвтествии с замечаниями и искать наиболее точное решение
...
Рейтинг: 0 / 0
28.12.2015, 13:47
    #39139285
Лысёк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
Сделал таблицу: первое поле - название возрастного интервала, второе поле - возраст min, третье поле - возраст max. На этом застопорился. Как построить выражение, чтобы "возраст min" было равно "NOW" минус 15 лет и "возраст max" соответственно "NOW" минус 17 лет?
...
Рейтинг: 0 / 0
28.12.2015, 13:52
    #39139287
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
Поле "возраст min" в этом супе лишнее - у тебя же нет дырок?
...
Рейтинг: 0 / 0
28.12.2015, 14:03
    #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
28.12.2015, 14:14
    #39139311
Лысёк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
Akina, спасибо, попробую
...
Рейтинг: 0 / 0
28.12.2015, 14:51
    #39139345
Лысёк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
Akina, выдает ошибку синтаксиса
...
Рейтинг: 0 / 0
28.12.2015, 14:54
    #39139354
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
Лысёквыдает ошибку синтаксисаОчень содержательно.
Где именно?
...
Рейтинг: 0 / 0
28.12.2015, 15:02
    #39139367
Лысёк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
Akina, в общем, модуль сохранился. С этим что делать SELECT [FIO],[BirthDate],AgeCategory([BirthDate]) AS [AgeCategory]
FROM [MyTable]
(первый раз создаю БД, так что ещё мало что понимаю)
...
Рейтинг: 0 / 0
28.12.2015, 15:05
    #39139376
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
ЛысёкС этим что делать
Выберите вкладку "Создание".
Нажмите кнопку "Конструктор запросов".
Закройте окно выбора таблиц.
Наверху слева выберите "Режим SQL".
Сотрите весь текст.
Вставьте туда запрос, заменив название таблицы MyTable и имена полей FIO и BirthDate на свои.
Закройте его с сохранением.
Всё, можно открывать запрос и любоваться на итог.
...
Рейтинг: 0 / 0
28.12.2015, 15:12
    #39139387
\\\\
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
Лысёк, готовые примеры не смотрим?
...
Рейтинг: 0 / 0
28.12.2015, 15:14
    #39139390
Лысёк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной
Akina, УРА!! Спасибо вам огромное!!!!
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Тип данных "Дата/время". Распределение на основании разницы между текущей датой и заданной / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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