首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MySQL进行时间计算

使用MySQL进行时间计算
EN

Stack Overflow用户
提问于 2017-03-06 04:02:56
回答 1查看 104关注 0票数 2

我正在为一个钢琴调音师的客户编写一个时间记录程序,并且我已经编写了以下PHP代码来给一个记录一个'to do‘的状态:

代码语言:javascript
复制
$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变量的格式为date(YYYY-MM-DD)。然后将其转换为(YYYY-MM)格式。

一旦转换完成,就会向$month_last_tuned变量添加一个与$tuning_period相同的额外月份数,为我们提供需要添加新记录时的月份和年值。

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

现在,我必须编写一个MySQL查询,以列出将作为即将到来或延迟返回的项目。

我该如何用MySQL编写这段代码呢?我不太擅长使用MySQL函数,如果能得到一些帮助,我将不胜感激。

我在逻辑上的尝试是:

代码语言:javascript
复制
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)

我知道这是完全错误的。不过,其中的逻辑还是很有道理的。

我的数据库模式如下:

我希望从查询返回的行数与上面PHP代码中的'late‘或’expect‘值相同。这意味着返回的行将在下一次调优日期的1个月内(从上次调优加上调优周期计算得出)。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-06 04:43:23

使用DateTime对象可能比操作日期字符串更好。

代码语言:javascript
复制
$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不应该用于“处理”东西。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42613302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档