MySQL - 使用星期开始在正确的星期内选择正确的数据

时间:2015-04-11 14:13:29

标签: php mysql sql

我正在尝试选择数据,在插入数据时,它会在提交时自动插入日期。因此,当插入数据时,它会插入当前日期。 但是,在我的表格中,我有一周的开始,所以我试图选择那周内的数据:

mysql> select * from week;
+---------+------+------------+
| week_id | week | date       |
+---------+------+------------+
|       1 | 1    | 2014-12-29 |
|       2 | 2    | 2015-01-05 |
|       3 | 3    | 2015-01-12 |
|       4 | 4    | 2015-01-19 |
|       5 | 5    | 2015-01-26 |
|       6 | 6    | 2015-02-02 |
|       7 | 7    | 2015-02-09 |
|       8 | 8    | 2015-02-16 |
|       9 | 9    | 2015-02-23 |
|      10 | 10   | 2015-03-02 |
|      11 | 11   | 2015-03-09 |
|      12 | 12   | 2015-03-16 |
|      13 | 13   | 2015-03-23 |
|      14 | 14   | 2015-03-30 |
|      15 | 15   | 2015-04-06 |
|      16 | 16   | 2015-04-13 |
|      17 | 17   | 2015-04-20 |

e.g。

select * from table where date='2015-04-06'; 

但是,由于插入日期为2015-04-10,因此不会选择和显示数据。检索该数据的唯一方法是:

select * from table where date='2015-04-10'; < when the data was inserted

所以我的问题是,是否有可能从那周开始选择那些数据? 因此,如果我从2015-04-06选择数据,它应显示2015-04-06至2015-04-12范围内的数据,这可能吗? 希望我已经正确解释过,解释一下有点难以尝试实现。如果需要,我可以添加更多信息。 注意:我试图在PHP中使用这个,所以日期是我只会使用一个变量,只是想我会说。

4 个答案:

答案 0 :(得分:1)

由于本周将始终从开始的6天结束,您可以使用between运算符和date_add函数,如下所示:

(针对您的具体示例):

select *
from table
where date between '2015-04-06' and date_add('2015-04-06', interval 6 day)

使用php变量:

select *
from table
where date between '$name_of_dt_var' and date_add('$name_of_dt_var', interval 6 day)

答案 1 :(得分:1)

您还可以使用WEEK()函数将输入数据的日期与星期表中的星期进行比较。

答案 2 :(得分:0)

假设weekweek()的值相同,则为:

select t.*
from table t
where week = week('2015-04-10');

即使数字不匹配,也可能是你有一些基准日期(例如2015-01-01和简单的算术会完成非常相似的事情)。

答案 3 :(得分:0)

我发现执行此类处理的最强大方法是将表格中的每个日期(在您的示例中为2015-04-10)截断到午夜的前一个星期一。这样,您可以通过将每个项目分配到该周的第一天来计算每个项目的周。

这个小公式返回前一个星期一,给出DATEDATETIME值。

 FROM_DAYS(TO_DAYS(datestamp) -MOD(TO_DAYS(datestamp) -2, 7))

例如,

 set @datestamp := '2015-04-10'
 SELECT FROM_DAYS(TO_DAYS(@datestamp) -MOD(TO_DAYS(@datestamp) -2, 7))

产生值2015-04-06

因此,如果您有一个名为sale的表格,您可以按周计算销售额:

 SELECT SUM(amount) weekly_amount,
        FROM_DAYS(TO_DAYS(datestamp) -MOD(TO_DAYS(datestamp) -2, 7)) week_beginning
   FROM sale
  GROUP BY FROM_DAYS(TO_DAYS(datestamp) -MOD(TO_DAYS(datestamp) -2, 7))

这是处理事情的一种非常方便的方式,因为它在年终转换时非常强大。 WEEK()功能也不起作用。

如果您的商家规则规定您的周数从周日而不是周一开始,请使用-1而不是-2,如下所示。

FROM_DAYS(TO_DAYS(datestamp) -MOD(TO_DAYS(datestamp) -1, 7))