Добрый день, на просторах интернета что-то не нашел простого и удобоваримого примера для выборки из справочника записей с днями рождения (ДР), которые подпадают под определенные условия, например, ДР, которые начинаются через неделю от тек.даты и продолжаются неделю. В результате пришлось написать самому… Может, кому пригодится, чтобы не тратить время. Использован релиз 8.3.13.1809.
Есть Справочник "Физические лица", есть реквизит "ДатаРождения"
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ФизическиеЛица.Фамилия КАК Фамилия,
| ФизическиеЛица.Имя КАК Имя,
| ФизическиеЛица.Отчество КАК Отчество,
| ФизическиеЛица.ДатаРождения КАК ДатаРождения,
|ИЗ
| Справочник.ФизическиеЛица КАК ФизическиеЛица
|ГДЕ
| ФизическиеЛица.ДатаРождения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
| И ВЫБОР
| КОГДА МЕСЯЦ(ФизическиеЛица.ДатаРождения) - МЕСЯЦ(&ТекДата) >= 0
| ТОГДА ДЕНЬГОДА(ФизическиеЛица.ДатаРождения) - ДЕНЬГОДА(&ТекДата) < 14
| КОГДА МЕСЯЦ(&ТекДата) = 12
| ТОГДА ДЕНЬГОДА(ФизическиеЛица.ДатаРождения) + &ПослДень - ДЕНЬГОДА(&ТекДата) < 14
| КОНЕЦ
| И ВЫБОР
| КОГДА МЕСЯЦ(ФизическиеЛица.ДатаРождения) - МЕСЯЦ(&ТекДата) >= 0
| ТОГДА ДЕНЬГОДА(ФизическиеЛица.ДатаРождения) - ДЕНЬГОДА(&ТекДата) >= 7
| КОГДА МЕСЯЦ(&ТекДата) = 12
| ТОГДА ДЕНЬГОДА(ФизическиеЛица.ДатаРождения) + &ПослДень - ДЕНЬГОДА(&ТекДата) >= 7
| КОНЕЦ";
Запрос.УстановитьПараметр("ПослДень", ДеньГода(Дата(Год(ТекущаяДата()),12,31)));
Запрос.УстановитьПараметр("ТекДата", ТекущаяДата());
ДниРождения = Запрос.Выполнить().Выгрузить();
Как видно из текста, запрос учитывает високосный год и переход через новый год.
Интервал выборки периода определяется цифрами 7 и 14 — естественно, они могут быть другими или определяться через параметры.
Не против, если кто-то предложит доработку для более универсального решения.
Попробуйте использовать функцию языка запросов ДЕНЬГОДА().
С ней текст запроса должен получиться намного проще.
Проверку на високосный год можно сделать там же, в запросе, если сравнивать день года для конца периода.
имхо выражение ФизическиеЛица.ДатаРождения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
можно заменить на чтонить типа Год(ФизическиеЛица.ДатаРождения) > 1917
Сегодня, благодаря мысли Lolipoka )), упростил…
Выражение ФизическиеЛица.ДатаРождения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) проверяет заполняемость реквизита…
(2) По собственному опыту знаю, что дату рождения нужно проверять на NULL и давать жесткий втык кадровикам, иначе будут качели со сдачей в ПФР. А не использовать «ГДЕ».
(4)сравнение <> пожалуй самое тормознутое
я гарантирую это