繁体   English   中英

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

[英]Group SQL results by week and specify “week-ending” day

我正在尝试选择按周工作的数据,我已经开始工作,但我需要能够指定一个不同的日期作为一周的最后一天。 我觉得有些东西需要接近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`

谢谢!


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

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

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


CASE WHEN (weekday(datetime)<=1) THEN date(datetime + INTERVAL (1-weekday(datetime)) DAY)
        ELSE date(datetime + INTERVAL (1+7-weekday(datetime)) DAY)

我希望这有帮助。

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

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` 

我想你必须在周日和周一之间做出选择? 当您可以使用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`

如何使用DATE_FORMAT

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM