按周分组SQL结果并指定“周末结束”日

时间:2010-10-23 00:14:43

标签: sql mysql datetime

我正在尝试选择按周工作的数据,我已经开始工作,但我需要能够指定一个不同的日期作为一周的最后一天。我觉得有些东西需要接近INTERVAL (6-weekday('datetime'))但不确定。这种SQL高于我的工资等级($ 0):P

SELECT 
    sum(`value`) AS `sum`, 
    DATE(adddate(`datetime`, INTERVAL (6-weekday(`datetime`)) DAY)) AS `dt` 
FROM `values` 
WHERE id = '123' AND DATETIME BETWEEN '2010-04-22' AND '2010-10-22' 
GROUP BY `dt` 
ORDER BY `datetime`

谢谢!

4 个答案:

答案 0 :(得分:6)

select
    sum(value) as sum,
    CASE WHEN (weekday(datetime)<=3) THEN date(datetime + INTERVAL (3-weekday(datetime)) DAY)
        ELSE date(datetime + INTERVAL (3+7-weekday(datetime)) DAY)
    END as dt
FROM values
WHERE id = '123' and DATETIME between '2010-04-22' AND '2010-10-22'
GROUP BY dt
ORDER BY datetime

这确实看起来很邪恶,但是,此查询将为您提供一个value的总和,按星期四(工作日()返回3)结束一周。

如果您希望更改一周结束的那一天,您只需要更换案例陈述中的3,即如果您想要星期二,您会说它

sum

我希望这会有所帮助。

答案 1 :(得分:1)

我喜欢简单的解决方案。这将返回星期开始的日期,假设星期日结束并从星期一开始。

DATE(`datetime`) - INTERVAL WEEKDAY(`datetime`) AS `dt` 

这可以很容易地调整到星期四结束一周,因为星期四比星期日早3天

DATE(`datetime`) - INTERVAL WEEKDAY(`datetime` + INTERVAL 3 DAY) AS `dt` 

这将返回从星期五开始到星期四结束的一周的开始。

你可以分组这个没问题。如果你想根据开始使用获得本周结束

DATE(`datetime`) - INTERVAL -6 + WEEKDAY(`datetime` + INTERVAL 3 DAY) AS `dt` 

答案 2 :(得分:0)

我认为你必须在周日和周一之间做出选择?当您可以使用DATE_FORMAT按日期的字符串格式进行分组,并使用%v进行星期一分组,使用%v进行星期日分组。

SELECT 
    sum(`value`) AS `sum`, 
     DATE_FORMAT(`datetime`,'%v.%m.%Y') AS `dt` 
FROM `values` 
WHERE id = '123' AND DATETIME BETWEEN '2010-04-22' AND '2010-10-22' 
GROUP BY  DATE_FORMAT(`datetime`,'%v.%m.%Y')
ORDER BY `datetime`

How to use DATE_FORMAT

答案 3 :(得分:-1)

我不记得确切的数学,但你可以通过在其参数中添加或减去天数来让WEEKDAY在一周的不同日期回绕。您需要在表达式中修改 x y 的不同值:

x-weekday(adddate(`datetime`, INTERVAL y DAY))