如何将当前周过滤为日期范围

use*_*979 2 mysql date

您好,我有一个 MySQL 数据库,我正在为学习日历设置一个表,字段如下:

SELECT
studycalendarpk,
studytopic,
`module`,
startdate,
enddate,
syllabusoutline
FROM studycalendar
Run Code Online (Sandbox Code Playgroud)

我想做的是创建一个查询,以便对于仪表板 php 页面,它有一个查询来显示当前几周的学习计划。有人可以告诉我如何设置查询来过滤它,以便在当前日期介于开始日期和结束日期之间时选择它,谢谢

O. *_*nes 5

表中的每一行都有一个startdate和一个enddate,如果我正确理解您的要求,您希望显示满足这些条件的所有行。

WHERE enddate >= start of week
  AND startdate < start of next week
Run Code Online (Sandbox Code Playgroud)

您的表中已经有startdate和。enddate此答案假设每行的结束日期被限制为大于或等于开始日期。如果不是,你会得到奇怪的结果。

您需要一个 MySQL 表达式来计算本周的第一天。下面是你如何做到这一点。

FROM_DAYS(TO_DAYS(CURDATE()) -MOD(TO_DAYS(CURDATE()) -1, 7))
Run Code Online (Sandbox Code Playgroud)

该表达式产生紧接在 之前的星期日CURDATE()。如果您的周被认为是从星期一开始,请改用此选项(请注意-2)。

FROM_DAYS(TO_DAYS(CURDATE()) -MOD(TO_DAYS(CURDATE()) -2, 7))
Run Code Online (Sandbox Code Playgroud)

这些是非常有用的表达式,因为它们产生实际日期。然后可以通过日期算术来操纵这些日期,例如somedate + INTERVAL 7 DAY可以方便地为您提供一周后的日期。这种算术甚至适用于日历年的最后一周和第一周。

将所有内容放在一起,您可以按以下步骤选择所需的记录。

WHERE enddate  >= FROM_DAYS(TO_DAYS(CURDATE())-MOD(TO_DAYS(CURDATE())-1,7))
  AND startdate < FROM_DAYS(TO_DAYS(CURDATE())-MOD(TO_DAYS(CURDATE())-1,7))
                   + INTERVAL 7 DAY
Run Code Online (Sandbox Code Playgroud)

这将从您的表中获取与本周相关的记录。