![](/img/trans.png)
[英]Create a Laravel / PHP script that runs periodically e.g. every 1 week to update my MySQL database with calls to an api
[英]Best method for making a MySQL query dynamic (e.g., update query parameters to show Previous Week)
我有一个查询,它按任务计算当前工作周的总工作时数:
SELECT name AS 'Task Name'
, sum(hours) AS `Total Hours`
FROM time_records
WHERE yearweek(record_date, 3) = yearweek(now(), 3)
GROUP BY
weekday(record_date), name
WHERE子句指定当前周:
WHERE yearweek(record_date, 3) = yearweek(now(), 3)
此数据使用MySQL查询和PDO语句显示为表。
我现在想通过单击表格下的链接(例如,“上周”)为查看者添加一个选项,以查看前一周的数据。 为了显示该数据,我需要更新WHERE子句以查询前一周:
WHERE yearweek(record_date, 3) = yearweek(now(), 3) - 1
我想知道最好的方法是什么? 我宁愿只保留整个查询的一个版本。 一种想法是使用PHP在查询中添加“ - 1”,例如:
WHERE yearweek(record_date, 3) = yearweek(now(), 3) <?php if (prev) {echo "- 1" ;} ?>
我认为这应该有效,但我怎样才能确定现状? 我应该将整个查询放在一个函数中,以便默认情况下它可以是“Time_hours(0)”,对于之前的它可以是“Time_hours(1)” - 或者是否有更好的方法?
我担心保持代码可管理并遵循最佳实践。 任何提示将不胜感激。 谢谢!
我建议您尝试一个查询,其中包含您要处理的周数之前的参数。 YEARWEEK是每周处理的糟糕选择,因为它很难处理年终翻滚。
如果您的周数从周日开始,请尝试这样做。 这将是本周。
select r.record_id, r.record_date, w.week weekstart
from record r
join (
select
(FROM_DAYS(TO_DAYS(CURDATE()) -MOD(TO_DAYS(CURDATE()) -1, 7))
- interval 0 week) week
)w
where record_date >= w.week
and record_date < w.week + interval 1 week
小提琴: http ://sqlfiddle.com/#!2/4c487/1/0
如果你想要,比如说,一周前,在你的查询中改变- interval 0 week
- interval 1 week
。 看到这个小提琴。 http://sqlfiddle.com/#!2/4c487/2/0
您可以在几周之前放置一个任意数字,甚至是跨越年末的几周。 例如,请参阅此处的interval -42 week
。 http://sqlfiddle.com/#!2/4c487/3/0
表达式FROM_DAYS(TO_DAYS(CURDATE()) -MOD(TO_DAYS(CURDATE()) -1, 7))
将当前日期向下FROM_DAYS(TO_DAYS(CURDATE()) -MOD(TO_DAYS(CURDATE()) -1, 7))
到上一个星期日。 如果要将其舍入到上一个星期一,请使用FROM_DAYS(TO_DAYS(CURDATE()) -MOD(TO_DAYS(CURDATE()) -2, 7))
。 例如: http : //sqlfiddle.com/#!2/4c487/8/0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.