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!
Simplemente funcionó perfecto. Gracias – davykiash
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
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