it-roy-ru.com

Как мне получить первый день недели свидания в 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 

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

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

14
davidahines

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

32
Stéphane

Если неделя начинается в воскресенье, сделайте это:

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

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

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

больше информации

62
Tsar

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

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

6
Cem Güler

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

  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

5
Egene

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

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

1
Kenny_D

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

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

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

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

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

0
Paul Ishak