Comment puis-je obtenir le premier jour d'une semaine donnée dont le numéro de semaine est disponible?
Par exemple, alors que j'écris cet article, nous en sommes à WEEK 29. J'aimerais écrire une requête MySQL qui renverra dimanche 18 juillet en utilisant WEEKNO 29 comme seul paramètre disponible.
Vous pouvez utiliser:
SELECT STR_TO_DATE('201003 Monday', '%X%V %W');
Cela vous donnerait la date du lundi de la troisième semaine de 2010, qui serait le 2010-01-18.
Un autre exemple:
SELECT STR_TO_DATE('201052 Sunday', '%X%V %W');
Je vous donnerais la date du dimanche de la semaine 52 de 2010, qui serait le 2010-12-26.
Et enfin, en utilisant votre exemple original:
SELECT STR_TO_DATE('201029 Sunday', '%X%V %W');
Cela donne 2010-07-18.
C'est un moyen précis d'obtenir le premier jour de la semaine et le dernier jour de la semaine en fonction de la date actuelle:
adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart,
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd
La réponse la plus appréciée jusqu’à présent sur ce tableau se présente comme suit:
SELECT STR_TO_DATE('201003 Monday', '%X%V %W');
Ceci est une bonne réponse pour commencer, mais il tombe en panne certains jours lorsque vous commencez à le mettre à utiliser en conjonction avec la fonction week (), sauf si vous ajoutez une logique supplémentaire.
Voici une version longue et compliquée de la même chose, mais qui semble fonctionner tous les jours (En passant, la date du jour est intégrée à cette réponse):
SELECT STR_TO_DATE(
(IF( CAST(WEEK(NOW(),0) AS UNSIGNED) = 0,
(CONCAT(
CAST((CAST(YEAR(NOW()) AS UNSIGNED) - 1) AS CHAR),
'52 Sunday')),
(CONCAT(
CAST(YEAR(NOW()) AS CHAR),
IF( CAST(WEEK(NOW(),0) AS UNSIGNED) < 10,'0','' ),
CAST(WEEK(NOW(),0) AS CHAR),
' Sunday')))),
'%X%V %W');
Ce gâchis résout les problèmes qui surviennent lorsque l’année se termine certains jours de la semaine. Par exemple, 2011 a commencé un samedi, le dimanche qui a commencé la semaine était donc l'année précédente. Voici la sélection avec des exemples codés en dur:
SELECT STR_TO_DATE(
(IF( CAST(WEEK('2011-01-01',0) AS UNSIGNED) = 0,
(CONCAT(
CAST((CAST(YEAR('2011-01-01') AS UNSIGNED) - 1) AS CHAR),
'52 Sunday')),
(CONCAT(
CAST(YEAR('2011-01-01') AS CHAR),
IF( CAST(WEEK('2011-01-01',0) AS UNSIGNED) < 10,'0','' ),
CAST(WEEK('2011-01-01',0) AS CHAR),
' Sunday')))),
'%X%V %W');
YEILDS >> '2010-12-26'
SELECT STR_TO_DATE(
(IF( CAST(WEEK('2011-01-02',0) AS UNSIGNED) = 0,
(CONCAT(
CAST((CAST(YEAR('2011-01-02') AS UNSIGNED) - 1) AS CHAR),
'52 Sunday')),
(CONCAT(
CAST(YEAR('2011-01-02') AS CHAR),
IF( CAST(WEEK('2011-01-02',0) AS UNSIGNED) < 10,'0','' ),
CAST(WEEK('2011-01-02',0) AS CHAR),
' Sunday')))),
'%X%V %W');
YEILDS >> '2011-01-02'
Cela dit, j'aime l'autre réponse postée qui ressemble à ceci
SELECT
adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart,
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd;
Cette méthode semble tout aussi bien fonctionner à toutes les dates sans le bordel!
Cela peut être le moyen le plus simple et dynamique pour cela. Utilisez le code suivant.
SELECT STR_TO_DATE( concat( concat( date_format( CURDATE( ) , '%Y' ) , WEEKOFYEAR( CURDATE( ) ) ) , ' Monday' ) , '%X%V %W' );
Si votre début de semaine est le dimanche et que le week-end est le samedi, utilisez celui-ci:
SELECT
DATE_ADD(CURDATE(), INTERVAL (MOD(DAYOFWEEK(CURDATE())-1, 7)*-1) DAY) AS week_start,
DATE_ADD(CURDATE(), INTERVAL ((MOD(DAYOFWEEK(CURDATE())-1, 7)*-1)+6) DAY) AS week_end
Testé sur MySQL.
Un ajout à la réponse de dcp:
SELECT STR_TO_DATE('201553 Monday', '%x%v %W')
Je vous donnerai le lundi quand votre début de semaine sera le lundi. Les spécificateurs de format doivent simplement être écrits en petits caractères. Pas besoin de maths.
Non testé (je n'ai pas MySQL sous la main):
date_add(
date_sub(curdate(), interval weekday(curdate()) day),
interval ((NUM-weekofyear(curdate()))*7) day)
SELECT CONCAT(RIGHT(STR_TO_DATE(CONCAT(YEARWEEK(NOW()),'Monday'), '%X%V %W'),2),'-',
MID(STR_TO_DATE(CONCAT(YEARWEEK(NOW()),'Monday'), '%X%V %W'),6,2),'-',
LEFT(STR_TO_DATE(CONCAT(YEARWEEK(NOW()),'Monday'), '%X%V %W'),4)) AS 'Lundi',
CONCAT(RIGHT(STR_TO_DATE(CONCAT(YEAR(NOW()), week(now(),3),'Sunday'), '%X%V %W'),2),'-',
MID(STR_TO_DATE(CONCAT(YEAR(NOW()), week(now(),3),'Sunday'), '%X%V %W'),6,2),'-',
LEFT(STR_TO_DATE(CONCAT(YEAR(NOW()), week(now(),3),'Sunday'), '%X%V %W'),4)) AS 'Dimanche';