MySql SELECT WHERE Date больше, чем последние 10 недель (начиная с предыдущего воскресенья)

Проблема, с которой я сталкиваюсь, заключается в том, что при запуске этого запроса он начинает недельный интервал с текущей даты (минус 7 дней с текущей даты). Хочу сделать все предыдущие 10 недель (вс-пн). Поэтому, если мое текущее свидание приходится на понедельник, вторник или среду, я хочу, чтобы оно начиналось в самое последнее воскресенье, а затем оглядываться на предыдущие 10 недель. Я считаю, что мне нужно использовать WEEKDAY или DAYOFWEEK в DATE_SUB, но безуспешно:

SELECT
    SUM(MT.QUANTITY) as qty,
    WEEKDAY(MT.TRANS_DATE) AS WEEKDAY,
    WEEK(MT.TRANS_DATE) AS WEEK,
    YEAR(MT.TRANS_DATE) AS YEAR
FROM
    mytable MT
WHERE
        MT.TRANS_DATE > DATE_SUB(CURDATE(), INTERVAL 10 WEEK)
GROUP BY WEEK

person ToddN    schedule 26.11.2012    source источник


Ответы (1)


Попробуйте использовать DATE_SUB(STR_TO_DATE(CONCAT(YEAR(CURDATE()),WEEK(CURDATE()),' Sunday'), '%X%V %W'),INTERVAL 10 WEEK), например:

SELECT
    SUM(MT.QUANTITY) as qty,
    WEEKDAY(MT.TRANS_DATE) AS WEEKDAY,
    WEEK(MT.TRANS_DATE) AS WEEK,
    YEAR(MT.TRANS_DATE) AS YEAR
FROM
    mytable MT
WHERE
        MT.TRANS_DATE > DATE_SUB(STR_TO_DATE(CONCAT(YEAR(CURDATE()),WEEK(CURDATE()),' Sunday'), '%X%V %W'),INTERVAL 10 WEEK)
GROUP BY WEEK

Также вы можете использовать другой способ, предложенный Pilcrow:

SUBDATE(CURDATE(), DAYOFWEEK(CURDATE()) - 1)

Что немного читабельнее ...

person DarkAjax    schedule 26.11.2012
comment
+1 Я считаю, что вычисления воскресенья на этой неделе SUBDATE(CURDATE(), DAYOFWEEK(CURDATE()) - 1) немного легче читать, чем манипуляции со строками, FWIW. Однако не должно иметь никакого значения в исполнении, поскольку оба они постоянны. - person pilcrow; 26.11.2012