Просто используйте прямое сравнение с литералом даты:
$result = DB::table('a')
->select(*)
->where('date', '<', '2019-03-01')
->get();
Это соответствует следующему необработанному запросу MySQL:
SELECT *
FROM a
WHERE date < '2019-03-01';
Обратите внимание, что вышеприведенное предложение WHERE
равно sargable , что означает, что можно использовать индекс, включающий столбец date
. Следующая версия, которую вы предлагаете, не предназначена для sargable:
SELECT *
FROM a
WHERE
YEAR(date) < 2019 OR (YEAR(date) = 2019 AND MONTH(date) < 3);
Вот код Laravel для этого:
$result = DB::table('a')
->select(*)
->whereYear('date', '<', '2019')
->orWhere(function($query) {
$query->whereYear('date', '=', '2019')
->whereMonth('date', '<', '3')
})
->get();