2010-09-29 3 views
1

Je sais déjà comment, par exemple, obtenir la date de demain dans une requête SQL; soit utiliser ADDDATE(CURDATE(),1) ou DATE_ADD(CURDATE(), INTERVAL 1 DAYS) (ou quelque chose comme ça). Mais comment aurais-je une date un peu plus excentrique, par exemple le 10 du mois prochain?Comment spécifier une date relative dans MySQL?

+0

Je pense que la meilleure chose à faire serait de gérer que dans votre application avant d'envoyer la requête au serveur SQL. Le 'strtotime (...)' de PHP peut gérer des formats bizarres comme ça, mais je ne connais aucun moyen facile en SQL. – JamesMLV

+0

Impossible de faire. Ceci est fait dans un fichier .sql. J'ai besoin de logique SQL pure. – Ricket

+0

Vouliez-vous littéralement trouver le 10 du mois prochain? Mon hypothèse était que vous vouliez un traitement de base du langage naturel, ce qui n'est pas vraiment faisable dans MySQL. –

Répondre

2

UPD

STR_TO_DATE(CONCAT(YEAR(NOW()) + IF(MONTH(NOW()) = 12, 1, 0), '-', IF(MONTH(NOW()) = 12, 0, MONTH(NOW())) + 1, '-', 10), '%Y-%m-%d') 

oui, il fait un peu bizarre, mais il résout problème ;-)

+1

Est-ce que ça ne va pas pour décembre? Et il cherchait probablement une solution plus générale. –

+0

Je ne suis pas sûr, je n'ai pas mysql à vérifier dès maintenant. Ce serait génial si quelqu'un le vérifiait. – zerkms

+0

'mysql> sélectionnez STR_TO_DATE (CONCAT (YEAR (NOW()), '-', 13, '-', 10), '% Y-% m-% d');' renvoie NULL. 12 comme le mois fonctionne. –

0

Il n'y a pas une telle chose "est maintenant de décembre" dans MySQL, cela doit être fait avant DB . Au moins avec la flexibilité que vous suggérez en voulant généralement "plus excentrique".

Peut-être pas une bonne idée d'avoir ce genre de logique dans une requête de toute façon? Selon votre cas de cours.

0

Je vais commencer en citant un commentaire d'en haut, et dire que je suis totalement d'accord avec elle:

Est-ce que vous voulez littéralement trouver le 10 du mois prochain? Mon hypothèse était que vous vouliez un traitement de base du langage naturel, ce qui n'est pas vraiment faisable dans MySQL. - Alexander Sagen Il ya 6 heures

Cependant, si vous êtes absolument, totalement, désespéré, alors vous pourriez envisager d'écrire votre propre fonction pour ce faire. Vous devez d'abord déterminer exactement quel type d'entrées vous allez envoyer (c'est-à-dire que vous allez littéralement passer une seule valeur de chaîne, par exemple "10 du mois prochain"), ou cela peut-il être représenté par jour, mois , donc 10, + 1 dans l'exemple. Si c'est le dernier, cela rend les choses beaucoup plus faciles. Sinon, vous cherchez à évaluer le texte de l'entrée et à prendre des décisions sur ce qu'il faut faire. Grandes déclarations IF, fondamentalement. C'est faisable - mais ce n'est pas ce que SQL a été fait pour.

+0

Désolé pour ne pas être clair. Je voulais simplement obtenir la date équivalente à (année)/(mois + 1)/10, pas analyser une chaîne. Merci d'avoir couvert toutes les bases! J'ai enlevé des citations pour peut-être clarifier la question. – Ricket

+0

Ah, c'est facile alors! Vous devriez être capable de le faire avec DATEADD. Vous pouvez toujours avoir besoin de le faire dans une fonction - mais il devrait s'agir d'ajouter le mois, de supprimer le même nombre de jours qu'aujourd'hui, puis d'ajouter autant de jours que vous le souhaitez. Donc pour 1,10 (10 du mois prochain) 1) ajouter 1 pour le mois à aujourd'hui = 29-10-2010, 2) enlever (jours en aujourd'hui = 29) = 01-10-2010, 3) ajouter 10 = 10-10-2010 –

0

Pour une logique de date complexe, vous pouvez envisager de pré-générer une table de dates et de la sélectionner. Avoir les colonnes appropriées rendra la sélection avec des clauses where plus faciles. C'est une technique commune et presque nécessaire pour les entrepôts de données. Quelque chose comme ça peut-être:

http://www.ipcdesigns.com/dim_date/

Ensuite, vous pouvez le faire (si je comprends bien son schéma):

SELECT full_date FROM date_table WHERE date_table.day_num_of_month = 10 AND date_table.month_num_overall = (SELECT month_num_overall+1 FROM date_table WHERE full_date = NOW())

Questions connexes