我想通了,所以我将其发布给任何可能需要它的人。
我意识到 mysql 中的所有星期函数都无法满足我的需要,因此我需要根据一周中当前日期的间隔来计算星期数。所以为了使这些工作,我不得不大量使用 dayofweek() 函数。它很长,我希望我可以让它更短,但我没有看到任何其他方式,如果我想在 sql 中而不是在 php 或任何其他前端语言中完成所有功能。我想可能还有其他人和我有同样的需求,所以如果未来版本的 mysql 包含一些可以内置这些东西的功能,那就太好了。
为了得到上周和本周的减法运算,如果星期天是星期天,这会产生一种特殊的效果,因为它不是返回 1-1=0,而是返回 7。显然,他们将其编程为原因,1-7 是唯一可以取的值。因此,为了克服这个问题,我不得不使用 cast() 函数将当前日期的星期几转换为整数。
这让我这个星期天:
select date_sub(curdate(), interval (dayofweek(curdate() -1)) day)
所以这让我上周日
select (date_sub(date_sub(curdate(), interval (dayofweek(curdate() -1)) day), interval 7 day))
终于到了上周六
select (date_sub(date_sub(curdate(), interval (dayofweek(curdate() -1)) day), interval 1 day))
所以我必须使用一些大于或小于或等于运算符。这是最终代码。
select Appointment.start, Appointment.subject from Appointment
where date(Appointment.start)
>=
(date_sub(date_sub(curdate(), interval (dayofweek(curdate() -1)) day), interval 7 day))
AND date(Appointment.start)
<=
(date_sub(date_sub(curdate(), interval (dayofweek(curdate() -1)) day), interval 1 day))
ORDER BY `Appointment`.`start` DESC
我将这些保存为视图,因此对于任何想要使用该代码并在 google 上找到它的人,这里是每个视图的完整代码,我通过在我的系统上手动设置不同的日期来确认这些代码有效。
查看名称:last_week_billable_jobs
select `Calendar`.`Appointment`.`start` AS `start`,`Calendar`.`Appointment`.`jobID` AS `jobID`,`Calendar`.`Appointment`.`inter_id` AS `inter_id`,`Calendar`.`Appointment`.`subject` AS `subject`,`Calendar`.`Appointment`.`location` AS `location`,`Calendar`.`Appointment`.`is_confirmed` AS `is_confirmed`,`Calendar`.`Appointment`.`is_authorized` AS `is_authorized`,`Calendar`.`Appointment`.`outcome_id` AS `outcome_id`,`Calendar`.`Appointment`.`region` AS `region`,`Calendar`.`Appointment`.`language` AS `language`,`Calendar`.`Interpreters`.`First_Name` AS `First_Name`,`Calendar`.`Interpreters`.`Last_Name` AS `Last_Name` from (`Calendar`.`Appointment` left join `Calendar`.`Interpreters` on((`Calendar`.`Appointment`.`inter_id` = `Calendar`.`Interpreters`.`inter_id`))) where ((cast(`Calendar`.`Appointment`.`start` as date) >= (curdate() - interval (cast(dayofweek(curdate()) as signed) + 6) day)) and (cast(`Calendar`.`Appointment`.`start` as date) <= (curdate() - interval (cast(dayofweek(curdate()) as signed) + 0) day)) and (`Calendar`.`Appointment`.`outcome_id` < 8)) order by `Calendar`.`Appointment`.`start`
视图名称:this_week_billable_jobs:
select `Calendar`.`Appointment`.`start` AS `start`,`Calendar`.`Appointment`.`jobID` AS `jobID`,`Calendar`.`Appointment`.`inter_id` AS `inter_id`,`Calendar`.`Appointment`.`subject` AS `subject`,`Calendar`.`Appointment`.`location` AS `location`,`Calendar`.`Appointment`.`outcome_id` AS `outcome_id`,`Calendar`.`Appointment`.`is_confirmed` AS `is_confirmed`,`Calendar`.`Appointment`.`is_authorized` AS `is_authorized`,`Calendar`.`Appointment`.`region` AS `region`,`Calendar`.`Appointment`.`language` AS `language`,`Calendar`.`Interpreters`.`First_Name` AS `First_Name`,`Calendar`.`Interpreters`.`Last_Name` AS `Last_Name` from (`Calendar`.`Appointment` left join `Calendar`.`Interpreters` on((`Calendar`.`Appointment`.`inter_id` = `Calendar`.`Interpreters`.`inter_id`))) where ((cast(`Calendar`.`Appointment`.`start` as date) >= (curdate() - interval (cast(dayofweek(curdate()) as signed) - 1) day)) and (cast(`Calendar`.`Appointment`.`start` as date) <= (curdate() - interval (cast(dayofweek(curdate()) as signed) - 7) day)) and (`Calendar`.`Appointment`.`outcome_id` < 8)) order by `Calendar`.`Appointment`.`start`
视图名称:next_week_billable_jobs:
select `Calendar`.`Appointment`.`start` AS `start`,`Calendar`.`Appointment`.`jobID` AS `jobID`,`Calendar`.`Appointment`.`inter_id` AS `inter_id`,`Calendar`.`Appointment`.`subject` AS `subject`,`Calendar`.`Appointment`.`location` AS `location`,`Calendar`.`Appointment`.`outcome_id` AS `outcome_id`,`Calendar`.`Appointment`.`region` AS `region`,`Calendar`.`Appointment`.`is_confirmed` AS `is_confirmed`,`Calendar`.`Appointment`.`is_authorized` AS `is_authorized`,`Calendar`.`Appointment`.`language` AS `language`,`Calendar`.`Interpreters`.`First_Name` AS `First_Name`,`Calendar`.`Interpreters`.`Last_Name` AS `Last_Name` from (`Calendar`.`Appointment` left join `Calendar`.`Interpreters` on((`Calendar`.`Appointment`.`inter_id` = `Calendar`.`Interpreters`.`inter_id`))) where ((cast(`Calendar`.`Appointment`.`start` as date) >= (curdate() + interval (8 - dayofweek(curdate())) day)) and (cast(`Calendar`.`Appointment`.`start` as date) <= (curdate() + interval (14 - dayofweek(curdate())) day)) and (`Calendar`.`Appointment`.`outcome_id` < 8)) order by `Calendar`.`Appointment`.`start`