Как мне получить первый день недели свидания в mysql? - PullRequest
16 голосов
/ 04 августа 2011

Предположим, у меня 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 

И да, я понимаю, что происхождение написано неправильно, но это было здесь раньше, поэтому я не могу исправить это, так как слишком много внутренних приложений ссылаются на него.

Итак, я группируюсь по неделям, но я хочу, чтобы это заполнило мой график, поэтому у меня не может быть, чтобы все начало недель выглядело как разные даты. Как мне это исправить?

Ответы [ 7 ]

69 голосов
/ 04 августа 2011

Если неделя начинается в воскресенье, выполните следующие действия:

DATE_ADD(mydate, INTERVAL(1-DAYOFWEEK(mydate)) DAY)

Если неделя начинается в понедельник, выполните следующие действия:

DATE_ADD(mydate, INTERVAL(-WEEKDAY(mydate)) DAY);

подробнее

33 голосов
/ 27 июня 2012

Если вам нужно обрабатывать недели, которые начинаются по понедельникам, вы также можете сделать это так. Сначала определите пользовательскую функцию 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.

И НЕДЕЛЯ :

Возвращает индекс дня недели для даты (0 = понедельник, 1 = вторник,… 6 = воскресенье).

8 голосов
/ 11 апреля 2018

Если неделя начинается в понедельник

  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

6 голосов
/ 04 августа 2011

выберите «2011-01-03» - ИНТЕРВАЛ (НЕДЕЛЯ («2011-01-03») + 1) ДЕНЬ;

возвращает дату первого дня недели. Вы можете посмотреть на это.

2 голосов
/ 25 марта 2019

Неделя начинается день с воскресенья, затем получить первую дату недели и последнюю дату недели

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
1 голос
/ 19 ноября 2013

Это гораздо более простой подход, чем написание функции для определения первого дня недели.

Некоторые варианты будут такими, как
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))

0 голосов
/ 03 октября 2017

Это работает от меня

Просто убедитесь, что обе даты в приведенном ниже запросе совпадают ...

SELECT ('2017-10-07' - INTERVAL WEEKDAY('2017-10-07') Day) As `mondaythisweek`

Этот запрос возвращает: 2017-10-02, который является понедельником,

Но если ваш первый день воскресенье, то просто вычтите день из результата этого и Уолла!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...