根据表中分配的日期范围按日期筛选记录


Filter records by date based on date ranges assigned in a table

我正在设置一个预定的cron作业,它每隔一个星期一启动一个PHP脚本。我的目标是运行一个SQL查询,该查询根据公司的工资周期返回工作订单——每个工资周期在我运行这个调度的cron作业之前的星期五结束。

我有一个SQL表,它列出了我公司所有的工资期,所以这个表有两列:payperiod_from(开始日期范围)和payperiod_to(结束日期范围)。我正在提取的工作订单有一个指定的日期。我希望能够调出日期介于payperiod_frompayperiod_to之间的工作订单。

由于工资周期每隔一个星期五结束,这个cron工作安排在星期一之后,我可以简单地使用CURDATE() - 3(周一-周五前3天);以获得payperiod_to日期,但是我如何运行查询来过滤工作订单,哪些工作订单的日期属于正确的工资周期?

希望这对你们中的一些人有意义。

尝试为"每隔一周"设置一个cron作业可能会遇到麻烦。这里有一个StackOverflow的答案;请注意答案下面的注释。

对于选择日期在正确的工资周期下的工作订单,如果您已经在计算工资周期结束于CURDATE()之前三天,为什么不忘记pay_periods表(或其他名称)并计算开始于CURDATE()之前16天的工资周期:

SELECT * FROM wkorder
WHERE wkorder.orderdate BETWEEN CURDATE() - INTERVAL 16 DAY AND CURDATE - INTERVAL 3 DAY

如果您不能让cron作业可靠地每隔一周运行一次,并且必须将其设置为每周运行一次,那么您可以使用pay_periods表过滤掉非周。如果前一个星期五不是付费期结束日期,这将阻止任何结果,因为在pay_period表中没有匹配:

SELECT * FROM wkorder
INNER JOIN pay_period ON
  payperiod_to = CURDATE() - INTERVAL 3 DAY AND
  wkorder.orderdate BETWEEN pay_period.payperiod_from AND pay_period.payperiod_to

最后,请注意上面的查询在语法上是正确的,但它们没有经过完全测试。从问题中的信息到实际的表结构,这是一个太大的飞跃。