Как правильно запрограммировать условие «по такое-то число»
Наверно, не будет преувеличением сказать, что я ни разу не видел, чтобы
Сейчас, в эпоху нейросетей, легко обобщить это наблюдение на всех программистов. Нейросети выдают как раз «усредненный» код. Так что рассмотрим фрагмент сгенерированного кода (дополнительный плюс в том, что на это некому обижаться, по крайней мере пока):
$dateFrom = $this->createDateTime($filters['dateFrom'], endOfDay: false);
if (null !== $dateFrom) {
$queryBuilder
->andWhere('log.loggedAt >= :dateFrom')
->setParameter('dateFrom', $dateFrom)
;
}
$dateTo = $this->createDateTime($filters['dateTo'], endOfDay: true);
if (null !== $dateTo) {
$queryBuilder
->andWhere('log.loggedAt <= :dateTo')
->setParameter('dateTo', $dateTo)
;
}
// ...
private function createDateTime(?string $value, bool $endOfDay): ?\DateTimeImmutable
{
if (null === $value || '' === $value) {
return null;
}
$date = \DateTimeImmutable::createFromFormat('Y-m-d', $value) ?: \DateTimeImmutable::createFromFormat(\DateTimeInterface::ATOM, $value);
if (false === $date) {
return null;
}
return $endOfDay ? $date->setTime(23, 59, 59) : $date->setTime(0, 0, 0);
}
Для простоты понимания перепишем этот код на чистом SQL для интервала, скажем, с 1 по 10 ноября:
SELECT *
FROM audit_logs
WHERE logged_at >= '2025-11-01'
AND loggged_at <= '2025-11-10 23:59:59'
Когда я вижу эти 23:59:59, у меня сразу возникает неприятное ощущение от того, насколько это неэстетичное решение. Некоторые не останавливаются на секундах, а добавляют еще и микросекунды, и время превращается в

Правильный способ состоит в том, чтобы не приписывать финальной дате последний доступный момент времени, а заменить условие «по
SELECT *
FROM audit_logs
WHERE logged_at >= '2025-11-01'
AND loggged_at < '2025-11-11'
Стоит запомнить этот шаблон использования полуоткрытых интервалов, когда нижняя граница диапазона включается в условие, а верхняя исключается. Он пригождается чаще, чем может показаться на первый взгляд.





Комментарии
```
created_at.between(some_date.start_of_day(), some_date.end_of_day())
```
Оставьте свой комментарий