我有一个包含3列的表格:user
,value
和date
。主查询根据日期范围返回特定用户的值:
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
答案 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。