Comment convertir le numéro de la semaine dans la date?
Donné une année et le calendrier de la semaine, comment puis-je obtenir le mardi de la semaine comme un jour?
- Ce parfum de " sql?'
Vous devez vous connecter pour publier un commentaire.
Donné une année et le calendrier de la semaine, comment puis-je obtenir le mardi de la semaine comme un jour?
Vous devez vous connecter pour publier un commentaire.
Donné que vous avez
year
etcw
(calendrier de la semaine) en tant que variables (par exemple, à partir d'une instruction SELECT) vous pouvez obtenir la DATE comme suit:La phrase
DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK)
est dupliquée; ne souhaitez pas stocker une variable. L'Instruction SQL travaillé bien pour moi sur MySQL.Mise à JOUR: Juste pour précision:
WEEKDAY(DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK))
donnera le premier jour de la semaine. Soustrayant un certain nombre de c' (-1 pour le mardi; -2 pour le mercredi et ainsi de suite va sélectionner un jour dans la semaine pour vous).Voir ici.
week of year
l'arithmétique sont en quelque sorte mal supportés par MySQL. Le mieux est de ne pas les utiliser du tout. En fait, la migration hors DEweek of year
est la raison pour laquelle j'ai écrit cette requête à la fois.MAKEDATE
pour cela, il va construire de fausses dates, en particulier lorsque vous utilisez des dates et un calendrier numéro de la semaine. Par exempleMAKEDATE(2017, 1)
vous donneraSun, 01 Jan 2017
, alors que c'est en fait la 52e semaine de 2016 et la première semaine de 2017 commence à Jan 2e. Au lieu d'utiliser cetteSTR_TO_DATE('2017 1 Monday', '%x %v %W')
pour obtenir leMonday
de la bonne semaine rendementMon, 02 Jan 2017
Dans MySQL le
STR_TO_DATE()
fonction peut faire le tour en une seule ligne!Exemple: Nous voulons obtenir la date de la
Tuesday
de la32
ème semaine de l'année2013
.de sortie:
Je pense que c'est le meilleur et le plus court de solution à votre problème.
STR_TO_DATE()
alors vous pouvez utiliser cette... STR_TO_DATE(CONCAT(YEAR(field), LPAD(WEEKOFYEAR(field, 2, '0'))..
CURDATE()
avec votredate_field
comme ceSELECT STR_TO_DATE(CONCAT(YEAR(CURDATE()),LPAD(WEEKOFYEAR(CURDATE()), 2, '0'),' ',DAYNAME(CURDATE())), '%X%V %W');
STR_TO_DATE(CONCAT(YEARWEEK(field, 2), ' Sunday'), '%X%V %W')
STR_TO_DATE('2013 1 Monday', '%X %V %W')
est en effet la première semaine du lundi au 2013.%x%v
(ISO 8601 numéro de la semaine comme en Europe) et%w
(nombre de jours à la place du nom).Les définitions de la semaine, j'ai trouvé tous dit "une période de sept jours consécutifs à compter du dimanche".
Voici MySQL spécifiques... votre kilométrage peut varier...
DATE_ADD(MAKEDATE(année 1), l'INTERVALLE de cw SEMAINE) ajoute les semaines à partir de la 1ère de l'année qui n'est pas correct...
Par cette définition, il n'est significatif que pour avoir le calendrier de la semaine de la gamme de 1-53, et à représenter le dimanche de la semaine. En tant que tel, nous allons ajouter 2 jours pour la n-ième dimanche de l'année pour obtenir le mardi.
Suivantes obtient la date du premier dimanche de l'année...
ce qui permettra d'obtenir la date de la 10e journée de dimanche (note de l'intervalle de 9 semaines puisque nous sommes déjà à 1)...
ajouter les 2 jours de plus pour arriver à mardi...
ou plus généralement:
En regardant indago réponse et ensuite de faire un tas de tests, j'ai fait le suivantes semaine que les résultats.
J'ai fait un ajustement mineur, et que les dates sont ensuite appariés:
Vous pouvez comparer les résultats avec ici.
Bien en théorie, vous pouvez utiliser DATEPART avec le dw paramètre pour arriver à trouver le premier mardi du mois, puis ajouter 7*[CalenderWeek] pour obtenir la date appropriée
http://msdn.microsoft.com/en-us/library/ms174420.aspx
Je pense que ce serait plus facile à écrire la logique de la fonction à l'aide de php.
Si vous utilisez un script php, vous pouvez mettre toutes les dates dans un format similaire à "jour-mois-année" et d'utiliser une boucle pour parcourir chaque jour (à partir des années 1980 pour 2038 ou à partir de votre mysql dates de la colonne).
http://www.php.net/manual/en/function.date-format.php
Puis utilisez le format de date sur les dates dans cette boucle pour convertir les jours de la semaine.
Voici une liste de choses qui peuvent être utilisés dans les formats de date. http://www.php.net/manual/en/function.date.php
D
N
l
w
tous vous aider avec les jours de la semaine.
Donné solutions ne considère pas que la première semaine de l'année peut commencer à la fin de décembre. Nous devons donc vérifier si, le 1er janvier, appartient à calendarweek de l'ancienne ou de la nouvelle année:
Ce résultat:
Ici est un exemple qui pourrait vous aider:
et le résultat est:
qui est aujourd'hui (mardi).
La upvoted solution a fonctionné pour moi en 2014 et 2015, mais n'a pas de travail pour moi en 2016 (peut-être parce que le début de l'Année, le lundi et non le dimanche.
J'ai utilisé la fonction suivante pour corriger cela:
STR_TO_DATE(
CONCAT(mod(day_nr + 1 ,7) , '/', week_nr, '/', année), '%m/%u/%Y')
Dans mes données :
day_nr = 0 -> le lundi,
day_nr = 6 -> dimanche
J'ai donc dû corriger cela avec une fonction mod