使用MySQL进行时间计算

时间:2017-03-05 20:02:56

标签: php mysql date mysqli

我正在为一位钢琴调音师的客户编写一个时间记录程序,并且我编写了以下PHP代码,以便为记录提供“待办事项”状态:

$last_tuned = '2017-01-05';
$tuning_period = 3;

$month_last_tuned = date('Y-m', strtotime(date('Y-m-d', strtotime($last_tuned))));

$next_tuning = date('Y-m', strtotime($month_last_tuned.(' +'.$tuning_period.' months')));

if (time() > strtotime($next_tuning.' -1 months')) {
    if (time() > strtotime($next_tuning)) {
        return 'late';
    } else {
        return 'upcoming';
    }
}

如您所见,$last_tuned变量是日期(YYYY-MM-DD)格式。然后将其转换为(YYYY-MM)格式。

一旦受到限制,我们会在$tuning_period变量中添加与$month_last_tuned相同的额外月份,为我们添加新记录时提供月份和年份值。

如果当前时间(在time()找到)大于$next_tuning变量 - 1个月,则返回任务为upcoming。如果它位于$next_tuning变量之后,则返回任务为late

我现在必须编写一个MySQL查询来列出即将到来或迟到的项目。

我如何在MySQL中写这个?我对MySQL功能不是很了解,非常感谢一些帮助。

我对逻辑的尝试是:

SELECT * FROM records
 // The next lines are to get the most recent month_last_tuned value and add the tuning_period variable
 WHERE 
    NOW() > (SELECT tuning_date FROM tunings ORDER BY tuning_date ASC LIMIT 1)
       +
    (SELECT tuning_period FROM records WHERE records.id = INITIAL CUSTOMER ID)

我知道那是完全错误的。但逻辑几乎就在那里。

我的数据库架构如下:

Schema

我希望查询返回的行与上面的PHP代码中的'late'或'coming'值一致。这意味着返回的行将在其下一个调整日期的1个月内(根据上次调整加调整周期计算)。

谢谢!

1 个答案:

答案 0 :(得分:3)

使用DateTime对象而不是操作日期字符串可能会更好。

$last_tuned = '2017-01-05';
$tuning_period = 3; // months

$dt_last_tuned = DateTimeImmutable::createFromFormat('Y-m-d',$last_tuned);
$dt_next_tuning = $dt_last_tuned->add(new DateInterval('P3M'));
$dt_now = new DateTimeImmutable();
$dt_tuning_upcoming = $dt_next_tuning->sub(new DateInterval('P1M'));

if( $dt_now > $dt_next_tuning) {
    return 'late';
}
if( $dt_now > $dt_tuning_upcoming) {
    return 'upcoming';
}

您还可以在MySQL查询中使用这些DateTime对象,方法是构建查询并根据需要传递$dt_next_tuning->format('Y-m-d H:i:s');之类的内容。

但是,根据您的表结构,可能更容易获取所有相关记录并处理它们。要确切地说这些部分是如何组合在一起有点困难,但一般来说MySQL不应该用于“处理”东西。