如何在 sql 中使用 YEARWEEK 获取前一周?

How to get previous week using YEARWEEK in sql?

我可以使用以下方式查询本周的物品:

SELECT * FROM data WHERE YEARWEEK(receivedOn, 1) = YEARWEEK(CURDATE(), 1)

但我想获取上周或前一周的项目。我该怎么做?

类似这样的事情(上周):

YEARWEEK(receivedOn - 1 * week, 1) = YEARWEEK(CURDATE() - 1 * week, 1)

前一周

YEARWEEK(receivedOn - 2 * week, 1) = YEARWEEK(CURDATE() - 2 * week, 1)

谢谢

一年中的当前周yearweek(sysdate() )

一年中的前一周 yearweek(sysdate() -interval 1 week )

一年中的前一周 yearweek(sysdate() -interval 2 week )

..等等

您可以使用:

WHERE YEARWEEK(receivedOn, 1) = YEARWEEK(CURDATE() - INTERVAL 7 DAY, 1)

注意:此表达式无法使用索引,因此它可能不是执行所需操作的最有效方法。

差不多。您不想调整 receivedOn,需要使用正确的日期算术语法:

YEARWEEK(receivedOn, 1) = YEARWEEK(CURDATE() - INTERVAL 1 WEEK, 1)

您的原始查询和给出的所有答案都对存储的列应用了日期函数。正如 Gordon Linoff 指出的那样,这是低效的,因为它不能利用列上的索引。

我建议改用直接过滤。您可以使用以下表达式获取本周的开始(从星期一开始,如您的原始代码所示):

current_date - interval weekday(current_date) day

从那以后,以下是如何过滤属于当前周的日期:

select * 
from data 
where receivedon >= current_date - interval weekday(current_date) day
  and receivedon <  current_date + interval 7 - weekday(current_date) day
  

如果要筛选上周:

where receivedon >= current_date - interval weekday(current_date) + 7 day
  and receivedon <  current_date + interval weekday(current_date) day

在那之前的一周:

where receivedon >= current_date - interval weekday(current_date) + 14 day
  and receivedon <  current_date + interval weekday(current_date) + 7  day