2010-07-23 8 views

Répondre

41

Vous pouvez utiliser:

SELECT STR_TO_DATE('201003 Monday', '%X%V %W'); 

Cela vous donne la date lundi de la semaine 3 de 2010, ce qui serait 2010-01-18.

Un autre exemple:

SELECT STR_TO_DATE('201052 Sunday', '%X%V %W'); 

Souhaitez-vous donner la date dimanche de la semaine 52 de 2010, ce qui serait 2010-12-26.

Et enfin, en utilisant votre exemple original:

SELECT STR_TO_DATE('201029 Sunday', '%X%V %W'); 

Cela donne 2010-07-18.

+0

Cela a juste fonctionné parfaitement. Merci – davykiash

+3

Lors de l'utilisation du mode semaine 3 (norme ISO, qv http://stackoverflow.com/questions/11788885/), alors SELECT STR_TO_DATE ('201003 Monday', '% X% V% W') donnera le lundi suivant la semaine! – ChrisV

+1

Je pense que ce n'est pas correct. Essayez d'exécuter SELECT STR_TO_DATE ('201402 dimanche', '% X% V% W'), STR_TO_DATE ('201402 lundi', '% X% V% W') - vous verrez que ce n'est pas dimanche de la 2ème semaine et lundi de la 2ème semaine - il est deuxième dimanche et 2ème lundi de l'année – 1nstinct

0

Untested (je n'ai pas MySQL à la main):

date_add(
    date_sub(curdate(), interval weekday(curdate()) day), 
    interval ((NUM-weekofyear(curdate()))*7) day) 
47

Ceci 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 
+9

Je pense que cette solution pourrait être affectée par les paramètres régionaux du système, je l'utilise à la place 'adddate (curdate(), INTERVAL -WEEKDAY (curdate()) JOUR) WeekStart' –

+1

@SnowBlind, merci pour votre commentaire. ... et si quelqu'un cherche vendredi comme dernier jour de la semaine (c'est-à-dire le dernier jour de travail), alors essayez ceci: adddate(curdate(), INTERVAL 4-WEEKDAY(curdate()) DAY) SHOULD_BE_Friday Peter

4

La réponse la plus aimé jusqu'à présent sur cette carte ressemble à ceci sous sa forme de base:

SELECT STR_TO_DATE('201003 Monday', '%X%V %W'); 

Ceci est une bonne réponse pour commencer, mais il tombe en panne quelques jours quand vous commencez à le mettre à utiliser conjointement avec la fonction semaine() sauf si vous ajoutez une logique supplémentaire .

Voici une version longue et désordonnée de la même chose, mais qui semble fonctionner tous les jours (BTW la date actuelle est construit dans ce asnwer):

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 gère les problèmes qui se posent quand l'année arrive à certains jours de la semaine. Par exemple, 2011 a commencé un samedi, alors le dimanche qui a commencé la semaine était 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'

Tout cela étant dit, J'aime l'autre asnwer affichée qui ressemble à ce

SELECT 
adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart, 
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd; 

cette méthode semble fonctionner aussi bien sur toutes les dates sans le désordre!

+1

Ne pourriez-vous pas rendre cela beaucoup plus simple en utilisant un mode 2? YEARWEEK ('2011-01-01', 2) rapporte la 52ème semaine de 2010, par opposition au mode 0, qui revient la 0ème semaine de 2011. – user1618143

2

Si votre week-départ est le dimanche et 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.

0
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

Un ajout à la réponse de dcp:

SELECT STR_TO_DATE('201553 Monday', '%x%v %W') 

vous donnera le lundi lorsque le début de la semaine est lundi. Les spécificateurs de format doivent juste être écrits en petit. Aucune maths nécessaire.

3

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'); 
Questions connexes