primer - semanas del mes mysql
Obteniendo el primer día de la semana en MySql usando la semana No (8)
Esta es una forma precisa de obtener el primer día de la semana y el último día de la semana en función de la fecha actual:
adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart,
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd
¿Cómo obtengo el primer día de una semana determinada cuyo número de semana está disponible?
Por ejemplo, mientras escribo esta publicación, estamos en WEEK 29. Me gustaría escribir una consulta MySQL que volverá el domingo 18 de julio utilizando este WEEKNO 29 como el único parámetro disponible.
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'' );
La respuesta más apreciada hasta ahora en este foro se ve así en su forma básica:
SELECT STR_TO_DATE(''201003 Monday'', ''%X%V %W'');
Esta es una buena respuesta para empezar, pero se descompone algunos días cuando comienza a usarla junto con la función de semana () a menos que agregue alguna lógica adicional.
Aquí hay una versión larga y desordenada de la misma cosa, pero que parece funcionar todos los días (por cierto, la fecha actual está incorporada en este artículo):
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 maneja los problemas que surgen cuando el año llega a su fin en 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 seleccionar con ejemplos codificados:
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 el otro asnwer publicado 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!
No probado (no tengo MySQL a la mano):
date_add(
date_sub(curdate(), interval weekday(curdate()) day),
interval ((NUM-weekofyear(curdate()))*7) day)
Puedes usar:
SELECT STR_TO_DATE(''201003 Monday'', ''%X%V %W'');
Esto le daría la fecha del lunes de la semana 3 de 2010, que sería el 2010-01-18.
Otro ejemplo:
SELECT STR_TO_DATE(''201052 Sunday'', ''%X%V %W'');
Te daría la fecha del domingo de la semana 52 de 2010, que sería 2010-12-26.
Y finalmente, usando tu ejemplo original:
SELECT STR_TO_DATE(''201029 Sunday'', ''%X%V %W'');
Esto da 2010-07-18.
Si su inicio de semana es el domingo y el fin de semana es el sábado, use este:
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 en MySQL.
Una adición a la respuesta de dcp:
SELECT STR_TO_DATE(''201553 Monday'', ''%x%v %W'')
Te dará el lunes cuando tu comienzo de la semana sea el lunes. Los especificadores de formato solo tienen que escribirse pequeños. No se necesitan matemáticas
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'';