ver - week mysql
¿Cómo convertir el número de semana en fecha? (9)
Al ver la respuesta de Indago y luego hacer un montón de pruebas, obtuve la semana siguiente como resultado.
He hecho un pequeño ajuste, y las fechas coinciden:
SELECT STR_TO_DATE(''2019 1 Monday'', ''%x %v %W'') -- beginning of week
SELECT STR_TO_DATE(''2019 1 Sunday'', ''%x %v %W'') -- end of week
Puedes comparar los resultados here .
Dado un año y una semana calendario, ¿cómo puedo obtener el martes de esa semana como una fecha?
Aquí hay una muestra que podría ayudar:
SET DATEFIRST 1
declare @wk int set @wk = 33
declare @yr int set @yr = 2011
select dateadd (week, @wk, dateadd (year, @yr-1900, 0)) - 2 -
datepart(dw, dateadd (week, @wk, dateadd (year, @yr-1900, 0)) - 4) as date
y el resultado es:
2011-08-16 00:00:00.000
que es hoy (martes).
Bueno, en teoría, podría usar DATEPART con el parámetro dw para encontrar el primer martes del mes y luego agregar 7 * [CalenderWeek] para obtener la fecha apropiada
Creo que sería más fácil escribir la lógica de la función usando php.
Si usa un script php, puede poner todas las fechas en un formato similar a "día-mes-año" y usar un bucle para recorrer todos los días (desde 1980 hasta 2038 o desde la columna de fechas de mysql).
http://www.php.net/manual/en/function.date-format.php
Luego use el formato de fecha en las fechas en ese ciclo para convertirlos a los días de la semana.
Aquí hay una lista de cosas que se pueden usar en formatos de fecha. http://www.php.net/manual/en/function.date.php D N l w le ayudará con el día de la semana.
En MySQL, la función STR_TO_DATE()
puede hacer el truco en una sola línea.
Ejemplo: Queremos obtener la fecha del Tuesday
de la semana 32
del año 2013
.
SELECT STR_TO_DATE(''2013 32 Tuesday'', ''%X %V %W'');
saldría:
''2013-08-13''
Creo que esta es la mejor y más corta solución para su problema.
La solución mejorada funcionó para mí en 2014 y 2015, pero no funcionó para mí en 2016 (posiblemente porque el comienzo del año es el lunes y no el domingo).
Utilicé la siguiente función para corregir esto:
STR_TO_DATE (CONCAT (mod (day_nr + 1, 7), ''/'', week_nr, ''/'', año), ''% w /% u /% Y'')
En mis datos: day_nr = 0 -> Monday,
day_nr = 6 -> domingo
Así que tuve que arreglar eso con una función mod
Las definiciones de la semana del calendario que encontré decían "un período de siete días consecutivos a partir del domingo".
Lo siguiente es específico para MySQL ... su millaje puede variar ...
DATE_ADD (MAKEDATE (año, 1), INTERVALO CW WEEK) agrega las semanas del 1 de año que no son correctas ...
mysql> select DATE_ADD(MAKEDATE(2011, 1), INTERVAL 1 WEEK);
+----------------------------------------------+
| DATE_ADD(MAKEDATE(2011, 1), INTERVAL 1 WEEK) |
+----------------------------------------------+
| 2011-01-08 |
+----------------------------------------------+
Según esta definición, solo tiene sentido tener un rango de semana calendario de 1 a 53, y esto representa el domingo de esa semana. Como tal, agregaríamos 2 días al n º domingo del año para obtener el martes.
A continuación se muestra la fecha del primer domingo del año ...
mysql> select date_add(''2012-01-01'', interval (8 - dayofweek(''2011-01-01'')) % 7 DAY);
+------------------------------------------------------------------------+
| date_add(''2012-01-01'', interval (8 - dayofweek(''2011-01-01'')) % 7 DAY) |
+------------------------------------------------------------------------+
| 2012-01-02 |
+------------------------------------------------------------------------+
así se obtendrá la fecha del 10º domingo (nota intervalo de 9 semanas ya que estamos en 1) ...
mysql> select date_add( date_add(''2010-01-01'', interval (8 - dayofweek(''2010-01-01'')) % 7 DAY) , interval 9 week);
+-----------------------------------------------------------------------------------------------------+
| date_add( date_add(''2010-01-01'', interval (8 - dayofweek(''2010-01-01'')) % 7 DAY) , interval 9 week) |
+-----------------------------------------------------------------------------------------------------+
| 2010-03-07 |
+-----------------------------------------------------------------------------------------------------+
añade 2 días más para llegar al martes ...
mysql> select date_add( date_add( date_add(''2010-01-01'', interval (8 - dayofweek(''2010-01-01'')) % 7 DAY) , interval 9 week), interval 2 day);
+--------------------------------------------------------------------------------------------------------------------------------+
| date_add( date_add( date_add(''2010-01-01'', interval (8 - dayofweek(''2010-01-01'')) % 7 DAY) , interval 9 week), interval 2 day) |
+--------------------------------------------------------------------------------------------------------------------------------+
| 2010-03-09 |
+--------------------------------------------------------------------------------------------------------------------------------+
o más en general:
select
date_add(
date_add(
date_add(''<year>-01-01'', interval (8 - dayofweek(''<year>-01-01'')) % 7 DAY)
, interval <week-1> week)
, interval <dayOfWeek> day
);
Las soluciones dadas no tienen en cuenta que la primera semana de un año puede comenzar a fines de diciembre. Así que debemos verificar, si el 1 de enero pertenece a calendarweek del año anterior o nuevo:
SET @week=1;
SET @year=2014;
SET @x_weeks_after_new_year=DATE_ADD(MAKEDATE(@year, 1), INTERVAL (SELECT IF(WEEKOFYEAR(MAKEDATE(@year, 1))>50 , 0 , -1))+@week WEEK);
SELECT
CONCAT(@year, ''-'', @week) WeekOfYear,
@weekStart:=DATE_SUB(@x_weeks_after_new_year, INTERVAL WEEKDAY(@x_weeks_after_new_year) DAY) Monday,
DATE_ADD(@weekStart, INTERVAL 6 DAY) Sunday
Esto resultará en:
+------------+------------+------------+
| WeekOfYear | Monday | Sunday |
+------------+------------+------------+
| 2014-1 | 2013-12-30 | 2014-01-05 |
+------------+------------+------------+
Dado que tiene year
y cw
(semana del calendario) como variables (por ejemplo, de una declaración SELECT) puede obtener la FECHA de la siguiente manera:
DATE_SUB(
DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK),
INTERVAL WEEKDAY(
DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK)
) -1 DAY),
La frase DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK)
está duplicada; No quería almacenar una variable. La declaración SQL me funcionó muy bien en MySQL.
ACTUALIZACIÓN: Solo para aclarar: WEEKDAY(DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK))
producirá el primer día de la semana. Restando un número de él (-1 para el martes; -2 para el miércoles y así sucesivamente, seleccionará un día específico de la semana para usted). Ver here