Выборка дней рождения

Выборка позволяет создать таблицу значений из справочника (или из чего-то подобного) с днями рождения с наперед заданными условиями.

Добрый день, на просторах интернета что-то не нашел простого и удобоваримого примера для выборки из справочника записей с днями рождения (ДР), которые подпадают под определенные условия, например, ДР, которые начинаются через неделю от тек.даты и продолжаются неделю. В результате пришлось написать самому… Может, кому пригодится, чтобы не тратить время. Использован релиз 8.3.13.1809.

Есть Справочник "Физические лица", есть реквизит "ДатаРождения"

       

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

Как видно из текста, запрос учитывает високосный год и переход через новый год.

Интервал выборки периода определяется цифрами 7 и 14 — естественно, они могут быть другими или определяться через параметры.

Не против, если кто-то предложит доработку для более универсального решения.

6 Comments

  1. lolipoka

    Попробуйте использовать функцию языка запросов ДЕНЬГОДА().

    С ней текст запроса должен получиться намного проще.

    Проверку на високосный год можно сделать там же, в запросе, если сравнивать день года для конца периода.

    Reply
  2. Fox-trot

    имхо выражение ФизическиеЛица.ДатаРождения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)

    можно заменить на чтонить типа Год(ФизическиеЛица.ДатаРождения) > 1917

    Reply
  3. user654641_yaga_m

    Сегодня, благодаря мысли Lolipoka )), упростил…

    Reply
  4. user654641_yaga_m

    Выражение ФизическиеЛица.ДатаРождения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) проверяет заполняемость реквизита…

    Reply
  5. user847517

    (2) По собственному опыту знаю, что дату рождения нужно проверять на NULL и давать жесткий втык кадровикам, иначе будут качели со сдачей в ПФР. А не использовать «ГДЕ».

    Reply
  6. Fox-trot

    (4)сравнение <> пожалуй самое тормознутое

    я гарантирую это

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *