带有两个参数

时间:2015-08-25 13:31:36

标签: mysql time frequency

在表格中,我有一个名为'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做到这一点,但从长远来看它不会很有效率

1 个答案:

答案 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