2009-05-20 24 views
19

tengo tres columnas: una columna de fecha, una columna de número entero, y una columna varchar como esto:Cómo utilizar un valor de cadena/columna como una constante de fecha MySQL intervalo (día, mes ...)?

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

Quiero usar los valores del entero y la columna de la varchar en un DATE_ADD mysql() funcionan como parte de la expresión "INTVERAL", agregada a la fecha en la columna 'fecha'.

Por ejemplo: DATE_ADD (2009-01-01, INTERVALO DÍA), de modo que el '2009-01-01' es de la columna de 'fecha', el '2' es de la columna "valor"/entero y el "DÍA" es de la columna 'unidad'/varchar.

y el selectivo se vería así:

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

El problema es: no funciona. La fecha y la columna entera de trabajo, por lo que esto está bien:

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

pero tan pronto que tratar de reemplazar el "DIA" palabra clave con un valor de cadena de una columna aparece un mensaje de error.

alguna idea?

supongo forma más general el problema es:

¿Cómo uso valores recuperados de forma dinámica como constantes expresiones/clave? ¿Hay una especie de función "eval" en MySQL?

Este problema me ha estado molestando desde hace mucho tiempo, cualquier ayuda sería muy grande.

golpe

Respuesta

6

Creo que es mejor usar una instrucción CASE para cada valor posible de la columna de la unidad, ya que es un universo finito. Puede elegir si desea mantener la columna como varchar o utilizar un código entero en su lugar.

Me desalentar el uso de forma dinámica ejecutar sentencias SQL, incluso cuando se genera a partir de una tabla existente a menos que esté 120% cuidado en la restricción de los valores que se insertan en la tabla. ¿Qué harías si de alguna manera obtuvieras los siguientes valores en la tabla? 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

estoy en el medio de volver a instalar MySQL en mi máquina, así que no puedo probarlo, pero tal vez la concatenación de ellas en una cadena válida podría ayudar, si se permite que CONCAT() aquí:

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

Probó esto y no funciona. – stldoug

12

Desafortunadamente MySQL espera una palabra clave después de intervalo y no cualquier cadena o un valor numérico. Puede lograr lo que quiere utilizando una declaración CASE y dar los diferentes casos con las diferentes palabras clave.

A modo de ejemplo, digamos que usted desea agregar el valor de la unidad que corresponda a la fecha a continuación, la instrucción SQL sería la siguiente:

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 

también trabaja en la cláusula WHERE por cierto :)

Cuestiones relacionadas