【问题标题】:Get all records where age is less than from a date difference in laravel获取年龄小于laravel中日期差异的所有记录
【发布时间】:2021-05-12 00:31:17
【问题描述】:

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

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

$date 和 $age 是自定义的。

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

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

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

这里的 date_of_birth 是 DB 中的一列。

【问题讨论】:

    标签: mysql laravel laravel-query-builder


    【解决方案1】:

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

    1.在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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • date_of_birth 是存储在数据库中的日期,我只想与自定义 $date 有所不同。这个查询给了我两个日期之间的记录。不是解决方案!
        • @KaleemShoukat。我对其进行了更新以提供明确的解决方案。你应该 date_of_birth 从现在到现在减去 5 年。
        • 感谢您的帮助,但这不是解决方案。
        猜你喜欢
        • 1970-01-01
        • 2016-07-10
        • 2011-12-18
        • 2013-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-06
        相关资源
        最近更新 更多