从 laravel 的日期差异中获取年龄小于的所有记录

Get all records where age is less than from a date difference in laravel

我正在尝试获取所有年龄小于 5 岁的儿童的记录。

计算年龄的日期应该是未来的日期,例如 2021-08-12

$date 和 $age 是自定义的。

$date 可以是任何未来日期,$age 是一个数字(例如 5)

我已经写了以下内容,但它不起作用。

$children=Child::whereRaw('DATEDIFF('.$date.', date_of_birth) < '.$age.'')
                ->get();

此处date_of_birth是数据库中的一列。

您可以使用whereBetween方法。并将其与 now() 或任何其他日期时间

进行比较
Child::whereBetween('date_of_birth', [now()->subYears(5), now()])->get();

调试后终于找到了解决办法。问题是 $date 没有作为字符串传递,因此没有找到天数,我不得不将天数转换为年数。这可能对某人有帮助。

$children=Child::whereRaw('(DATEDIFF("'.$date.'",date_of_birth)/365) < '.$age.'')
          ->get();

避免原始表达式和复杂查询您可以使用虚拟列

1.Add 在 created_at 之后将此添加到您的迁移,或者您可以创建新的迁移

$table->char('date_of_birth_year',3)->virtualAs('DATE_FORMAT(FROM_DAYS(DATEDIFF(CURRENT_DATE, date_of_birth)),"%y")');

运行 你的迁移

现在您可以运行以下查询来获取在特定月份创建的记录

$yearsOld = ['01', '02', '03', '04'];

$childrens = Child::query()
    ->whereIn('date_of_birth_year', $yearsOld)
    ->get();

如果您想了解更多信息,请查看以下链接

  1. https://laravel.com/docs/8.x/migrations#column-modifiers
  2. https://www.w3schools.com/sql/func_mysql_date_format.asp