2009-05-20 9 views
19

J'ai trois colonnes: une colonne de date, une colonne entière, et une colonne varchar comme ceci:Comment utiliser une valeur de chaîne/colonne comme constante d'intervalle de date mysql (DAY, MONTH ...)?

+------------+------+---------+ 
| date  |value | unit | 
+------------+------+---------+ 
| 2009-01-01 | 2 | DAY  | 
| 2009-02-01 | 3 | MONTH | 
+------------+------+---------+ 

Je veux utiliser les valeurs de l'entier et la colonne varchar dans une fonction date_add mysql() comme partie de l'expression "INTVERAL", ajoutée à la date dans la colonne "date".

Par exemple: date_add (2009-01-01, INTERVALLE JOUR), de sorte que le '2009-01-01' est de la colonne 'date', le '2' est dans la colonne "value"/integer et "DAY" dans la colonne "unit"/varchar.

Et la sélection ressemblerait à ceci:

select date_add(table.date_column, INTERVAL table.integer_column table.varchar_column) from table 

Le problème est: il ne fonctionne pas. La date et le travail de la colonne entière, donc c'est ok:

select date_add(table.date_column, INTERVAL table.integer_column DAY) from table 

mais dès que j'essaie de remplacer le « JOUR » Mot-clé avec une valeur de chaîne à partir d'une colonne, je reçois un message d'erreur.

Une idée?

Je suppose que, plus généralement, le problème est:

Comment puis-je utiliser des valeurs constantes automatiquement récupérées comme/expressions clés? Existe-t-il une sorte de fonction "eval" dans mysql?

Ce problème m'inquiète depuis longtemps maintenant, toute aide serait vraiment géniale.

beat

Répondre

6

Je pense que vous feriez mieux d'utiliser une instruction CASE pour chaque valeur possible de la colonne de l'unité, car il est un univers fini. Vous pouvez choisir de conserver la colonne en tant que varchar ou utiliser un code entier à la place. Je déconseillerais l'utilisation d'instructions SQL exécutées dynamiquement, même si elles sont générées à partir d'une table existante, à moins que vous ne soyez prudent à 120% en restreignant les valeurs qui sont insérées dans la table. Que feriez-vous si vous aviez en quelque sorte les valeurs suivantes dans le tableau? Oops!

+------------+------+------------------------------------+ 
| date  |value |     unit    | 
+------------+------+------------------------------------+ 
| 2009-01-01 | 2 | DAY        | 
| 2009-02-01 | 3 | MONTH        | 
| 2009-03-01 | 4 | DAY) FROM table; DROP TABLE table; | 
+------------+------+------------------------------------+ 
-3

Je suis au milieu de réinstaller MySQL sur ma machine, donc je ne peux pas tester, mais peut-être les concaténer dans une chaîne valide pourrait aider, si CONCAT() est autorisé ici:

SELECT 
    DATE_ADD(
     table.date_column, 
     INTERVAL CONCAT(
     table.integer_column, 
     ' ', 
     table.varchar_column 
    ) 
    ) 
+0

Testé ceci et cela ne fonctionne pas. – stldoug

12

Malheureusement, MySQL attend un mot-clé après INTERVAL et aucune valeur numérique ou chaîne. Vous pouvez réaliser ce que vous voulez en utilisant une instruction CASE et donner les différents cas avec les différents mots-clés.

À titre d'exemple, disons que vous voulez ajouter la valeur à l'unité appropriée à la date alors l'instruction SQL serait comme suit:

SELECT CASE unit 
     WHEN "DAY" THEN date_add(date, INTERVAL value DAY) 
     WHEN "MONTH" THEN date_add(date, INTERVAL value MONTH) 
     END 
     AS newDate 
FROM table 

travaille également dans la clause WHERE par la voie :)

Questions connexes