2017-03-05 74 views
2

我正在写一个时间记录程序的客户,谁是钢琴调音师,我已经写了下面的PHP代码给创纪录的“做”状态:时间计算与MySQL

$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代码上面的“晚”或“即将到来的”值。这意味着返回的行将在其下一个调整日期的1个月内(根据上次调整加上调整周期计算)。

谢谢!

+0

挂起,那'$ month_last_tuned'行...你是否将'$ last_tuned'转换为一个时间,然后转换为'date()',然后*返回*时间,所以你可以将它格式化为'日期'再次没有“日”部分??? –

+0

更新你的问题添加表模式..一个适当的数据样本和预期的结果..请 – scaisEdge

+0

@NiettheDarkAbsol - 这是将某种格式的时间戳转换为另一种格式?有一个更好的方法吗? –

回答

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不应该用于“处理”内容。

+1

感谢您的支持。我想知道如何在MySQL中执行任务,这样我就可以直接用查询字符串获取'迟'或'即将到来'的行,而不必通过PHP处理它,然后再决定它是否值得数据位。 –

+1

@RyanCastle查看编辑 - 不幸的是,很难确切地告诉你数据如何组合在一起,但一般来说,你不应该在MySQL的一面做“处理”工作。 –

+1

刚刚看到您的编辑。可以处理MySQL结果,然后丢弃数据直到满意为止,但是这样做的时间可能相当长。 –