Jak uzyskać pierwszy dzień tygodnia daty w mysql?

Załóżmy, że mam 2011-01-03 i chcę dostać pierwszy tydzień, czyli niedzielę, czyli 2011-01-02, jak mam to zrobić?

Powodem jest to, że mam takie zapytanie:

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 

I tak, zdaję sobie sprawę, że origin jest napisane źle, ale to było tutaj, zanim byłem, więc nie mogę go poprawić, ponieważ zbyt wiele wewnętrznych aplikacji odwołuje się do niego.

Więc grupuję według tygodni, ale chcę, aby to wypełniło mój wykres, więc nie mogę mieć wszystkich początku tygodni wyglądających jak różne daty. Jak mam to naprawić?

Author: davidahines, 2011-08-04

6 answers

Jeśli musisz poradzić sobie z tygodniami, które zaczynają się w poniedziałki, możesz to zrobić również w ten sposób. Najpierw zdefiniuj niestandardową funkcję FIRST_DAY_OF_WEEK:

DELIMITER ;;
CREATE FUNCTION FIRST_DAY_OF_WEEK(day DATE)
RETURNS DATE DETERMINISTIC
BEGIN
  RETURN SUBDATE(day, WEEKDAY(day));
END;;
DELIMITER ;

I wtedy możesz zrobić:

SELECT FIRST_DAY_OF_WEEK('2011-01-03');

Dla twojej informacji, MySQL zapewnia dwie różne funkcje do pobierania pierwszego dnia tygodnia. Istnieje DAYOFWEEK :

Zwraca indeks dni powszednich dla Daty(1 = niedziela , 2 = poniedziałek,..., 7 = sobota). Te wartości indeksu odpowiadają standardowi ODBC.

Oraz :

Zwraca indeks dni powszednich Dla daty(0 = poniedziałek, 1 = wtorek, ... 6 = niedziela).

 29
Author: Stéphane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-27 15:56:27

Jeśli tydzień zaczyna się w niedzielę zrób to:

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

Jeśli tydzień zaczyna się w poniedziałek zrób to:

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

Więcej informacji

 56
Author: Tsar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-17 21:09:38

Select '2011-01-03' - INTERVAL (WEEKDAY ('2011-01-03')+1) DAY;

Zwraca datę pierwszego dnia tygodnia. Możesz się temu przyjrzeć.

 6
Author: Cem Güler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-04 15:34:57

Jeśli tydzień zaczyna się w poniedziałek

  SELECT SUBDATE(mydate, weekday(mydate));

Jeśli tydzień zaczyna się w niedzielę

  SELECT SUBDATE(mydate, dayofweek(mydate) - 1);

przykład:

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

 3
Author: Egene,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-11 16:11:15

Jest to znacznie prostsze podejście niż pisanie funkcji do określania pierwszego dnia tygodnia.

Niektóre warianty byłyby takie jak
SELECT DATE_ADD((SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1)DAY),INTERVAL 7 DAY) (dla daty końcowej zapytania, np. pomiędzy " datą początkową "i"datą końcową").
SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1) DAY (Dla daty rozpoczęcia zapytania).

Zwróci wszystkie wartości dla bieżącego tygodnia. Przykładowe zapytanie będzie następujące:
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
Author: Kenny_D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-19 11:21:27

This works form me

Upewnij się, że obie daty w poniższym zapytaniu są takie same...

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

To zapytanie zwraca: 2017-10-02 czyli poniedziałek,

Ale jeśli twój pierwszy dzień jest niedziela, to po prostu odjąć dzień od wyniku tego i wallah!

 0
Author: Paul Ishak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-03 03:28:29