2010-07-23 12 views

Respuesta

41

que puede utilizar:

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

Esto le daría el día lunes de la semana 3 de 2010, lo que sería 2010-01-18.

Otro ejemplo:

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

le pondrías a la fecha de domingo de la semana 52 del año 2010, lo que sería 2010-12-26.

Y, por último, la utilización de su original ejemplo:

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

Esto da 2010-07-18.

+0

Simplemente funcionó perfecto. Gracias – davykiash

+3

Al usar el modo de semana 3 (norma ISO, qv http://stackoverflow.com/questions/11788885/), SELECCIONAR STR_TO_DATE ('201003 Monday', '% X% V% W') dará el lunes del siguiente ¡semana! – ChrisV

+1

Creo que no es correcto. Intenta ejecutar SELECT STR_TO_DATE ('201402 Sunday', '% X% V% W'), STR_TO_DATE ('201402 Monday', '% X% V% W') - verás que no es domingo de la segunda semana y el lunes de la segunda semana - es el segundo domingo y el segundo lunes de AÑO – 1nstinct

0

No comprobado (no tengo a la mano de MySQL):

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

Esta es una forma precisa de conseguir el primer día de la semana y el último día de la semana en base a la fecha actual:

adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart, 
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd 
+9

Creo que esta solución podría verse afectada por la configuración regional del sistema. En su lugar, uso esta 'adddate (curdate(), INTERVAL -WEEKDAY (curdate()) DAY) WeekStart' –

+1

@SnowBlind, gracias por tu comentario. ... y si alguien está buscando el viernes como último día de la semana (es decir, el último día de trabajo), intente lo siguiente: adddate(curdate(), INTERVAL 4-WEEKDAY(curdate()) DAY) SHOULD_BE_Friday Peter

4

La respuesta más gustado hasta ahora en este tablero tiene este aspecto en su forma básica:

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

Esta es una buena respuesta para empezar, pero se degrada en algunos días cuando se empieza a ponerlo a trabajar en conjunto con la función de semana() a menos que agregue un poco de lógica adicional .

Aquí está una versión larga, desordenado de lo mismo, pero que parece que funciona en todos los días (por cierto, la fecha actual se construye en este 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'); 

Este desorden se encarga de los problemas que se presentan cuando el año llega a ciertos días de la semana. Por ejemplo, 2011 comenzó un sábado, por lo que el domingo que comenzó la semana fue el año anterior. Aquí está el selecto con ejemplos cifrados duros:

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'

Dicho todo esto, me gusta la otra asnwer publicó que se parece a esto

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

este método parece funcionar igual de bien en todas las fechas sin el lío!

+1

¿No podría hacer esto mucho más simple usando un modo de 2? YEARWEEK ('2011-01-01', 2) informa la 52ª semana de 2010, a diferencia del modo 0, que devuelve la 0ª semana de 2011. – user1618143

2

Si su semana de inicio es el domingo y el fin de semana es el sábado, utilizar éste:

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 

probado con 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

Una adición a la respuesta de DCP:

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

le dará el lunes, cuando el comienzo de la semana es el lunes. Los especificadores de formato solo tienen que escribirse pequeños. No se necesitan matemáticas

3

Esta puede ser la forma más simple y dinámica para ello. Usa el siguiente código

SELECT STR_TO_DATE(concat(concat(date_format(CURDATE() , '%Y') , WEEKOFYEAR(CURDATE())) , ' Monday') , '%X%V %W'); 
Cuestiones relacionadas