代码之家  ›  专栏  ›  技术社区  ›  Ian McIntyre Silber

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

  •  3
  • Ian McIntyre Silber  · 技术社区  · 14 年前

    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 回复  |  直到 14 年前
        1
  •  6
  •   Payload    14 年前

    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
    

    这看起来确实很糟糕,但是,这个查询将为您提供 价值

    如果你想改变星期几是星期几,你只需要把case语句中的3替换掉就行了

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

    我希望这能有帮助。

        2
  •  1
  •   700 Software    14 年前

    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` 
    
        3
  •  0
  •   Andrey Frolov    14 年前

    我认为你必须在星期天和星期一之间做出选择?当您可以使用日期格式按日期的字符串格式分组,并使用%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

        4
  •  -1
  •   Marcelo Cantos    14 年前

    我不记得确切的数学公式了,但你可以通过加上或减去它的论点,让工作日在一周中的不同日期结束。你需要修正不同的价值观 是的

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