在MySQL中将月转换为周

在MySQL中将月转换为周,mysql,Mysql,我希望在MySQL中将一个月分解为几个星期(从周一开始) 比如说, Sept 3 - 9th Sept 10 - 16th 如何使用MySql实现这一点 提前感谢。您可以使用功能周(日期)此查询将生成您想要的结果。它使用联合生成一个月内可能的周数表(0到4),然后将这些周数添加到该月第一个星期一的计算中(存储在变量@firstday中,该变量与周数表相连) 要运行任何给定月份的查询,请将计算@firstday(4个位置)中的CURDATE()替换为您感兴趣的月份中的日期,例如 SELE

我希望在MySQL中将一个月分解为几个星期(从周一开始)

比如说,

 Sept 3 - 9th 

 Sept 10 - 16th
如何使用MySql实现这一点


提前感谢。

您可以使用功能周(日期)

此查询将生成您想要的结果。它使用
联合
生成一个月内可能的周数表(0到4),然后将这些周数添加到该月第一个星期一的计算中(存储在变量@firstday中,该变量与周数表相连)

要运行任何给定月份的查询,请将计算
@firstday
(4个位置)中的
CURDATE()
替换为您感兴趣的月份中的日期,例如

SELECT @firstday + INTERVAL w WEEK AS start, @firstday + INTERVAL w WEEK + INTERVAL 6 DAY AS end 
FROM (SELECT 0 AS w UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) weeks
JOIN (SELECT @firstday := FROM_DAYS(TO_DAYS('2018-01-20')-DAY('2018-01-20')+1) +
                          (7 - WEEKDAY(FROM_DAYS(TO_DAYS('2018-01-20')-DAY('2018-01-20')+1))) % 7) f
HAVING end <= LAST_DAY(@firstday)
如果您具有设置变量的灵活性,则可以如下方式清理查询:

SET @day = '2018-01-20';
SET @firstday := FROM_DAYS(TO_DAYS(@day)-DAY(@day)+1) + (7 - WEEKDAY(FROM_DAYS(TO_DAYS(@day)-DAY(@day)+1))) % 7;
SELECT @firstday + INTERVAL w WEEK AS start, @firstday + INTERVAL w WEEK + INTERVAL 6 DAY AS end 
FROM (SELECT 0 AS w UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) weeks
HAVING end <= LAST_DAY(@firstday)
SET@day='2018-01-20';
设置@firstday:=从天(到天)到天(天)+1+(7-工作日(从天(到天)到天(天)+1))%7;
选择@firstday+间隔w周作为开始,@firstday+间隔w周+间隔6天作为结束
从(选择0作为w工会选择1工会选择2工会选择3工会选择4)周

结束这一切应该会有所帮助。另外,我想将一个月的值分解为一周的值。例如,如果2018年9月的值为16,我想将其分解为相应的周值。对于9月1-2日的一周,因为它为9月->日(2*16)/30的2天;9月3-9->(7*16)/30日的一周。同样对于9月30日至10月6日这一周(假设10月的值=20),计算结果为:(1*16)/30+(6*20)/31。如何做到这一点?嗨,Prajwal,这应该是另一个问题,因为它超出了这个问题的范围。同时,如果这个答案解决了你的问题,请考虑标记它被接受。看见
SELECT @firstday + INTERVAL w WEEK AS start, @firstday + INTERVAL w WEEK + INTERVAL 6 DAY AS end 
FROM (SELECT 0 AS w UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) weeks
JOIN (SELECT @firstday := FROM_DAYS(TO_DAYS('2018-01-20')-DAY('2018-01-20')+1) +
                          (7 - WEEKDAY(FROM_DAYS(TO_DAYS('2018-01-20')-DAY('2018-01-20')+1))) % 7) f
HAVING end <= LAST_DAY(@firstday)
start       end     
2018-01-01  2018-01-07
2018-01-08  2018-01-14
2018-01-15  2018-01-21
2018-01-22  2018-01-28
SET @day = '2018-01-20';
SET @firstday := FROM_DAYS(TO_DAYS(@day)-DAY(@day)+1) + (7 - WEEKDAY(FROM_DAYS(TO_DAYS(@day)-DAY(@day)+1))) % 7;
SELECT @firstday + INTERVAL w WEEK AS start, @firstday + INTERVAL w WEEK + INTERVAL 6 DAY AS end 
FROM (SELECT 0 AS w UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) weeks
HAVING end <= LAST_DAY(@firstday)