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?
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).
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);
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.
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
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))
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!