MYSQL:从上周一开始获取所有结果)

时间:2018-04-25 15:53:26

标签: mysql date

CREATE TABLE `sport_data` (
      `id` int(255) NOT NULL,
      `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `sport` varchar(255) NOT NULL,
      `musclePlan` varchar(255) NOT NULL,
      `sport_time` varchar(255) NOT NULL,
      `kcal` varchar(255) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

如何从上周(周一到周日)获取此表中的所有数据?

我试过了:

WHERE date >= curdate() - INTERVAL DAYOFWEEK(curdate())+5 DAY AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-2 DAY

我不知道这是否正确?

提前致谢。

2 个答案:

答案 0 :(得分:0)

>=<模式是我们通常使用的模式。那部分看起来是正确的。

我认为问题是关于返回范围起始值和结束值的表达式

我建议我们针对各种日期值测试这些表达式,而不只是CURDATE()。我们可以使用值代替CURDATE(),并检查结果,并对一系列日期值执行此操作。

方便的是,这些表达式将在SELECT列表中对WHERE子句中的表达式进行评估。因此,我们可以运行SELECT语句,并检查结果。

例如:

SELECT t.dt                                      AS dt
     , t.dt - INTERVAL DAYOFWEEK(t.dt)+5 DAY     AS _ge
     , t.dt - INTERVAL DAYOFWEEK(t.dt)-2 DAY     AS _lt
  FROM (
         SELECT CURDATE() + INTERVAL 0 DAY AS dt
         UNION ALL SELECT CURDATE() + INTERVAL -1 DAY
         UNION ALL SELECT CURDATE() + INTERVAL -2 DAY
         UNION ALL SELECT CURDATE() + INTERVAL -3 DAY
         UNION ALL SELECT CURDATE() + INTERVAL -4 DAY
         UNION ALL SELECT CURDATE() + INTERVAL -5 DAY
         UNION ALL SELECT CURDATE() + INTERVAL -6 DAY
         UNION ALL SELECT CURDATE() + INTERVAL -7 DAY
         UNION ALL SELECT CURDATE() + INTERVAL -8 DAY
         UNION ALL SELECT CURDATE() + INTERVAL -9 DAY
         UNION ALL SELECT CURDATE() + INTERVAL -10 DAY
       ) t

如果表达式返回我们期望的值,根据规范,对于每个可能的日期值,则表达式是正确的。

如果表达式返回的值不符合规范,那么我们需要进行调整。请注意,&#34;有效的表达式&#34;在星期三的某个日期可能不会&#34;工作&#34;在星期天约会。)

答案 1 :(得分:0)

DEMO: Showing 3 approaches and why current doesn't work.

如果我们假设上周&#34;&#34;你的意思是你现在所在的一天之前一周的最后一个星期一星期日...

所以,如果今天是20180422,你想要20180409-20180415

SELECT *
FROM SO50026532_sport_data
CROSS JOIN (SELECT @Today:=curdate()) z
WHERE date >= @today - interval (6 + case when dayofweek(@today)=1 then 7 else dayofWeek(@today)-1 end) day
  and date <=@today - interval (case when dayofweek(@today)=1 then 7 else dayofWeek(@today)-1 end) day;

或者如果你的粉丝是&gt; =和&lt;那么

SELECT *
FROM SO50026532_sport_data
CROSS JOIN (SELECT @Today:=curdate()) z
WHERE date >= @today - interval (6 + case when dayofweek(@today)=1 then 7 else dayofWeek(@today)-1 end) day
  and date <@today - interval (case when dayofweek(@today)=1 then 7 else dayofWeek(@today)-1 end-1) day;

在第二个例子中,我们不得不减去1,因为dayofweek不是0。当然,我可以把日期改为2,并将星期日定为6 ......然后我就不会这样做了。需要减去1.然后我们在第一部分加上7而不是6。 (演示有这3个,你的初始例子显示4/22会发生什么。

Dayofweek从星期日开始为1.所以我使用一个案例陈述将1改为7,而其他所有其他1则给我们星期一= 1和星期日= 7

派生表z的交叉连接是这样我可以更容易地控制curdate()并进行测试。如果需要,可以用curdate()替换变量,并消除交叉连接和派生表。

第一个where子句减去6天(1周,然后是从当前日期回到星期一的天数。这确保我们总是从当前日期和星期一开始1周。然后我们只获得日期到星期日那一周。