Как получить первый день недели даты в mysql?
Предположим, что у меня есть 2011-01-03, и я хочу получить первую неделю, которая состоится в воскресенье, а это 2011-01-02, как я могу это сделать?
Причина в том, что у меня есть этот запрос:
select
YEAR(date_entered) as year,
date(date_entered) as week, <-------This is what I want to change to select the first day of the week.
SUM(1) as total_ncrs,
SUM(case when orgin = picked_up_at then 1 else 0 end) as ncrs_caught_at_station
from sugarcrm2.ncr_ncr
where
sugarcrm2.ncr_ncr.date_entered > date('2011-01-01')
and orgin in(
'Silkscreen',
'Brake',
'Assembly',
'Welding',
'Machining',
'2000W Laser',
'Paint Booth 1',
'Paint Prep',
'Packaging',
'PEM',
'Deburr',
'Laser ',
'Paint Booth 2',
'Toolpath'
)
and date_entered is not null
and orgin is not null
AND(grading = 'Minor' or grading = 'Major')
and week(date_entered) > week(current_timestamp) -20
group by year, week(date_entered)
order by year asc, week asc
И да, я понимаю, что происхождение написано неправильно, но оно было здесь до того, как я был, поэтому я не могу его исправить, поскольку слишком много внутренних приложений ссылаются на него.
Итак, я группируюсь по неделям, но я хочу, чтобы это заполнило мою диаграмму, поэтому я не могу иметь начало недели, похожее на разные даты. Как это исправить?
Ответы
Ответ 1
Если вам нужно обрабатывать недели, которые начинаются по понедельникам, вы также можете сделать это именно так. Сначала определите пользовательскую функцию FIRST_DAY_OF_WEEK
:
DELIMITER ;;
CREATE FUNCTION FIRST_DAY_OF_WEEK(day DATE)
RETURNS DATE DETERMINISTIC
BEGIN
RETURN SUBDATE(day, WEEKDAY(day));
END;;
DELIMITER ;
И тогда вы могли бы сделать:
SELECT FIRST_DAY_OF_WEEK('2011-01-03');
Для вашей информации MySQL предоставляет две различные функции для получения первого дня недели. Существует DAYOFWEEK:
Возвращает индекс недели дня (1 = воскресенье, 2 = понедельник,..., 7 = суббота). Эти значения индекса соответствуют стандарту ODBC.
И WEEKDAY:
Возвращает индекс недели дня (0 = понедельник, 1 = вторник,... 6 = воскресенье).
Ответ 2
Если неделя начнется в воскресенье, сделайте следующее:
DATE_ADD(mydate, INTERVAL(1-DAYOFWEEK(mydate)) DAY)
Если неделя начнется в понедельник, сделайте следующее:
DATE_ADD(mydate, INTERVAL(-WEEKDAY(mydate)) DAY);
подробнее
Ответ 3
Если неделя начинается в понедельник
SELECT SUBDATE(mydate, weekday(mydate));
Если неделя начинается в воскресенье
SELECT SUBDATE(mydate, dayofweek(mydate) - 1);
Пример:
SELECT SUBDATE('2018-04-11', weekday('2018-04-11'));
2018-04-09
SELECT SUBDATE('2018-04-11', dayofweek('2018-04-11') - 1);
2018-04-08
Ответ 4
выберите '2011-01-03' - INTERVAL (WEEKDAY ('2011-01-03') + 1) ДЕНЬ;
возвращает дату первого дня недели. Вы можете заглянуть в нее.
Ответ 5
Это гораздо более простой подход, чем запись функции для определения первого дня недели.
Некоторые варианты будут такими, как
SELECT DATE_ADD((SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1)DAY),INTERVAL 7 DAY)
(для даты окончания запроса, например, между "начальной датой" и "датой окончания" ).
SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1) DAY
(для даты начала запроса).
Это вернет все значения текущей недели. Пример запроса будет следующим:
SELECT b.foo FROM bar b
WHERE b.datefield BETWEEN
(SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1) DAY)
AND
(SELECT DATE_ADD((SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1)DAY),INTERVAL 7 DAY))
Ответ 6
Неделя начинается день с воскресенья, затем получить первое число недели и последнее число недели
SELECT
DATE("2019-03-31" + INTERVAL (1 - DAYOFWEEK("2019-03-31")) DAY) as start_date,
DATE("2019-03-31" + INTERVAL (7 - DAYOFWEEK("2019-03-31")) DAY) as end_date
Неделя начинается день с понедельника, затем получить первую дату недели и последнюю дату недели
SELECT
DATE("2019-03-31" + INTERVAL ( - WEEKDAY("2019-03-31")) DAY) as start_date,
DATE("2019-03-31" + INTERVAL (6 - WEEKDAY("2019-03-31")) DAY) as end_date
Ответ 7
Это работает со мной
Просто убедитесь, что обе даты в следующем запросе совпадают...
SELECT ('2017-10-07' - INTERVAL WEEKDAY('2017-10-07') Day) As `mondaythisweek`
Этот запрос возвращает: 2017-10-02, который является понедельником,
Но если ваш первый день воскресен, то просто вычтите день из результата этого и wallah!