将相对周数列添加到MySQl结果

时间:2010-05-27 16:01:01

标签: sql mysql datetime

我有一个包含3列的表格:uservaluedate。主查询根据日期范围返回特定用户的值:

SELECT date, value FROM values
WHERE user = '$user' AND
date BETWEEN $start AND $end

我希望结果还有一个列,表示相对于日期范围的周数。因此,如果日期范围是2010年1月1日 - 2010年1月20日,那么该范围的第一个星期日 - 星期六的任何结果都是week 1,下一个星期日 - 星期六是week 2,等等如果日期范围从星期六开始,则只有那一天的结果为week 1。如果日期范围从星期四开始,但第一个结果是在下一个星期一,那么它将是week 2,并且没有week 1个结果。

添加到查询中这是否相当简单?我能提出的唯一想法是基于一年的周数或基于结果本身的周数(在上面的第二个例子中,第一个结果总是得到week 1)。

实施例

 $start = "05/27/2010";
 $end =   "06/13/2010";

 //Query 

 Result:

 week      date            user       value
  1        05/28/2010      joe        123
  3        06/07/2010      joe        123
  3        06/08/2010      joe        123
  4        06/13/2010      joe        123

1 个答案:

答案 0 :(得分:2)

这可以通过这个简单明了的表达式轻松完成:)

SELECT ...,
    FLOOR(
        (
            DATEDIFF(date, $start) +
            WEEKDAY($start + INTERVAL 1 DAY)
        ) / 7
    ) + 1 AS week_number;

一些解释:此表达式只计算给定日期和开始日期之间的差异,然后通过FLOOR("difference in days" / 7) + 1将此数字转换为周数。这很简单,但由于这仅在$ start为星期日时才有效,我们应该为其他工作日添加一个偏移:WEEKDAY($start + INTERVAL 1 DAY)等于0为Sun,1为Mon,...,6为Sat。