MySql:根据时间戳和动态间隔

时间:2017-06-15 06:04:11

标签: php mysql laravel-5 php-carbon

在我的MySql DB中,我有以下字段:

 id | email_id |  interval  |      start_at       |    last_sent_at
--- | -------- | ---------- | ------------------- | -------------------
 1  |   8293   | +6 months  | 2017-06-14 16:59:54 | 2017-06-14 16:59:54
--- | -------- | ---------- | ------------------- | -------------------
 2  |   8904   |   (NULL)   | 2017-05-14 12:32:45 |      (NULL)        

我正在尝试为用户创建一种动态方式,以便在laravel中设置电子邮件作业的计划。我们的想法是使用laravel的命令调度程序来运行一个命令来检查所有预定的电子邮件,然后在它们尚未发送的情况下运行它们(whereNull(last_sent_at))或者它们上次发送的时间是否更多比当前时间减去6个月或12个月或他们为该领域选择的内容。

我尝试了几种不同的查询来使其工作无济于事。在laravelized代码中,我尝试了以下内容......

$schedules = Schedule::selectRaw('schedules.schedulable_id, schedules.schedulable_type, UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(schedules.interval) as NowPlusInterval')
    ->whereNull('last_sent_at')
    ->orWhere('schedules.last_sent_at', '>=', 'NowPlusInterval')
    ->get();

$schedules = Schedule::whereNull('last_sent_at')
    ->orWhereRaw('schedules.last_sent_at >= NOW()-'.Carbon::parse('schedules.interval')->toDateTimeString())
    ->get();

以及许多其他变体。第二个对我来说是最简单的但是因为我将db字段传递给php函数它没有认识到我正在尝试从db字段中获取值(而不是解析一个字符串调用' schedules.interval')。有没有把这个字段写入一个Carbon可以解析的变量,或者是否有一个我可以运行的原始mysql查询给我所有last_sent_at为null的字段,现在减去列出的间隔大于last_sent_at 。

我已经在脑子里绞了好几个小时。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

尝试使用mysql的DATE_SUB()和INTERVAL函数。有什么影响:

->whereRaw('last_sent_at >= SUB_DATE(NOW(), INTERVAL 6 MONTH)')

或者也许这样:

->whereNull('last_sent_at')
    ->orWhere(DB::raw('DATE(`schedules.last_sent_at`) >= DATE_SUB(NOW(), INTERVAL `schedules.interval`')))
    ->get();