[英]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`
我不记得确切的数学,但是你可以通过在参数中添加或减去天数来让WEEKDAY在一周中的不同日期回绕。 您需要在表达式中修改x和y的不同值:
x-weekday(adddate(`datetime`, INTERVAL y DAY))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.