我正在设置一个预定的cron作业,它每隔一个星期一启动一个PHP脚本。我的目标是运行一个SQL查询,该查询根据公司的工资周期返回工作订单——每个工资周期在我运行这个调度的cron作业之前的星期五结束。
我有一个SQL表,它列出了我公司所有的工资期,所以这个表有两列:payperiod_from
(开始日期范围)和payperiod_to
(结束日期范围)。我正在提取的工作订单有一个指定的日期。我希望能够调出日期介于payperiod_from
和payperiod_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
最后,请注意上面的查询在语法上是正确的,但它们没有经过完全测试。从问题中的信息到实际的表结构,这是一个太大的飞跃。