我正在尝试选择按周工作的数据,我已经开始工作,但我需要能够指定一个不同的日期作为一周的最后一天。我觉得有些东西需要接近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`
谢谢!
答案 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`
答案 3 :(得分:-1)
我不记得确切的数学,但你可以通过在其参数中添加或减去天数来让WEEKDAY在一周的不同日期回绕。您需要在表达式中修改 x 和 y 的不同值:
x-weekday(adddate(`datetime`, INTERVAL y DAY))