web-dev-qa-db-fra.com

Comment puis-je obtenir le premier jour de la semaine d'une date dans mysql?

Supposons que je dispose du 2011-01-03 et que je souhaite obtenir le premier de la semaine, dimanche, le 2011-01-02, comment puis-je procéder?

La raison est que j'ai cette requête:

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 

Et oui, je me rends compte que l’origine est mal orthographiée, mais c’était là avant moi, je ne peux donc pas le corriger car trop d’applications internes le mentionnent.

Donc, je regroupe par semaines mais je veux que cela remplisse mon graphique, donc je ne peux pas avoir tout le début de semaine qui ressemble à des dates différentes. Comment puis-je réparer ça?

14
davidahines

Si vous devez gérer des semaines commençant le lundi, vous pouvez également le faire de cette façon. Commencez par définir une fonction FIRST_DAY_OF_WEEK personnalisée:

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

Et alors vous pourriez faire:

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

Pour votre information, MySQL fournit deux fonctions différentes pour récupérer le premier jour de la semaine. Il y a DAYOFWEEK :

Renvoie l'index des jours de la semaine pour la date (1 = dimanche, 2 = lundi,…, 7 = samedi). Ces valeurs d'index correspondent au standard ODBC. 

Et JOUR DE LA SEMAINE :

Renvoie l'index des jours de la semaine pour la date (0 = lundi, 1 = mardi,… 6 = dimanche).

32
Stéphane

Si la semaine commence le dimanche, procédez comme suit:

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

Si la semaine commence lundi, procédez comme suit:

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

Plus d'informations

62
Tsar

sélectionnez '2011-01-03' - INTERVALLE (WEEKDAY ('2011-01-03') + 1) JOUR; 

renvoie la date du premier jour de la semaine. Vous pouvez y regarder. 

6
Cem Güler

Si la semaine commence le lundi

  SELECT SUBDATE(mydate, weekday(mydate));

Si la semaine commence le dimanche

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

Exemple:

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

C'est une approche beaucoup plus simple que d'écrire une fonction pour déterminer le premier jour de la semaine.

Certaines variantes seraient telles que 
SELECT DATE_ADD((SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1)DAY),INTERVAL 7 DAY) (pour la date de fin d'une requête, par exemple entre "date de début" et "date de fin"). 
SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1) DAY (pour la date de début d'une requête).

Cela renverra toutes les valeurs de la semaine en cours. Un exemple de requête serait comme suit:
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

Cela fonctionne de moi

Assurez-vous simplement que les deux dates dans la requête ci-dessous sont les mêmes ...

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

Cette requête renvoie: 02/10/2017 qui est un lundi,

Mais si votre premier jour est dimanche, il vous suffit de soustraire un jour du résultat de ceci et de wallah!

0
Paul Ishak