首页 > 解决方案 > 如何在 Laravel Carbon 中使用动态间隔以便仅从 mysql 中选择未来 10 天的日期

问题描述

我需要从列中获取问题被回答的日期(日期)本身加上几天的数据库结果。我已经尝试了很多使用 Carbon 和 mysql INTERVAL,但我被语法困住了。

我正在使用 Laravel 6 和 Carbon。

我有一个名为“问题”的表,从那里我想得到一个在某个日期被回答的问题的 ID,再加上我在另一个名为“重复”的列中的天数。

像这样的东西:

->where( 'answered_at', '<', Carbon::now()->subDays('repeat'))

但是,我不能只写“重复”,因为它不会将其识别为表格。如果我在那里写一个数字,它确实有效。

这有效:

->where( 'answered_at', '<', Carbon::now()->subDays(10))

但由于添加到日期的动态天数来自数据库,因此我必须将其作为动态字段。我试图在查询之前获取它,并将其用作 $ 变量,但是 - 这会创建两个不同的 mysql 查询并且意味着性能不佳。

所以我希望它能够工作,但是我无法弄清楚语法:

->where( 'answered_at', '<', Carbon::now()->subDays('COLUMN_REPEAT_FROM_DB'))

我也试过这个:

->whereRaw("DATE_ADD(answered_at, INTERVAL 10 DAY) <= NOW()")

哪个有效,但 INTERVAL 10 DAY 然后被硬编码和

->whereRaw("DATE_ADD(answered_at, INTERVAL 'repeat' DAY) <= NOW()")

也不起作用..语法!

整个查询如下所示:

$question = \DB::table('questions')
     ->where( 'answered_at', '<', Carbon::now()->subDays('repeat'))
     ->value('answered_at');

(我得到 answer_at 作为值只是为了查看哪个日期出来以便对其进行测试,稍后将更改为 id 并传递给另一个函数)。

任何指针高度赞赏!

标签: laraveldateintervals

解决方案


您上次查询的方式是正确的,但是您使用了错误的引号。

您应该使用反引号来指定列名:

$query->whereRaw("DATE_ADD(answered_at, INTERVAL `repeat` DAY) <= NOW()")

或者,您可以使用此查询获得相同的结果:

$query->whereRaw("DATEDIFF(NOW(), answered_at) >= `repeat`")

不过,计算本身似乎是错误的。如果您想选择当前日期 answered_at + repeat DAYS区间内的行,那么它应该>=在您的查询和<=我的查询中。


推荐阅读