在表格中,我有一个名为'service_time'的列,它是服务的开始日期,另一列是'times_year',即每年要完成服务的次数。
我遇到的问题是当 - >时我应该如何选择行。 (thisMonth == service_time(month))OR(thisMonth == service_time(month)+ 12 / times_year) 我无法解决的棘手问题是,如果'times_year'是1-4之间的值,我应该怎么做?没有制作4个不同的OR ??
那么它应该是由'times_year'决定的循环,而不是每次都检查所有4个OR的OR查询,即使'times_year'不是4吗?
更新:
我需要帮助如何在sql查询语句中执行循环,只会选择'月'是否正确,所以现在基本上是'08',如果service_time设置为2015-03-01(一天无关紧要)它应与times_year一起检查以检查2015-03-01是否有服务> 2015-03 + 12/4(作为示例)然后2015-06,2015-09,2015-12,2016-03然后没有选择等等...... 我可以用PHP做到这一点,但从长远来看它不会很有效率
答案 0 :(得分:0)
希望您没有{,1}等值,如5,11等等。这样做会有点讨厌。像1,2,3,4,6,12这样的值很好。
您可以在MySQL中确定开始时间之后的下一个服务时间
times_year
同样,开始时间后的第三个服务时间将如下所示。
service_time + INTERVAL (12 DIV times_year) MONTH
也许您的业务规则要求服务在每个月的最后一个日历日或之前到期。您可以这样显示。
service_time + INTERVAL 3*(12 DIV times_year) MONTH
最后,您可能希望在今天之后显示下一个服务截止日期(LAST_DAY(service_time + INTERVAL 3*(12 DIV times_year) MONTH)
之后)您是如何做到的?
首先,自第一次服务时间以来已经过了这么多个月了:
CURDATE()
接下来,您想知道涵盖的服务间隔数。易:
TIMESTAMPDIFF(MONTH, service_time, CURDATE())
接下来,您需要下一个最高服务间隔号:
times_year * TIMESTAMPDIFF(MONTH, service_time, CURDATE()) / 12.0
最后,将其插入下一个服务时间函数:
CEIL(times_year * TIMESTAMPDIFF(MONTH, CURDATE(), service_time) / 12.0)
这是一个很长的公式,但它有效。
最后,您可以使用此WHERE子句查找在本月末之前到期的所有服务。
service_time + INTERVAL
CEIL(times_year * TIMESTAMPDIFF(MONTH, service_time, CURDATE()) / 12.0)*
(12 DIV times_year) MONTH