web-dev-qa-db-fra.com

Obtenir le premier jour de la semaine dans MySql avec la semaine n °

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. 

31
davykiash

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.

42
dcp

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
48
David Merrill

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!

4
Jonathan

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' );
3
Sachin K

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.

2
crab

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. 

0
Dave Pløger

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)
0
pascal
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';
0
Pierre