如何使用字符串/列值作为mysql日期间隔常量(DAY,MONTH ...)?

时间:2009-05-20 16:30:43

标签: mysql datetime

我有三列:日期列,整数列和varchar列,如下所示:

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

我希望将mysql date_add()函数中的integer和varchar列的值用作“INTVERAL”表达式的一部分,并添加到“date”列中的日期。

例如: date_add( 2009-01-01 ,INTERVAL 2 DAY ),以便'2009-01-01'来自'date'列,'2'来自“value”/整数列,“DAY”来自'unit'/ varchar列。

选择将如下所示:

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

问题是:它不起作用。日期和整数列都有效,所以没关系:

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

但是我尝试用列中的字符串值替换“DAY”关键字时会收到错误消息。

任何想法?

我想更普遍的问题是:

如何将动态检索的值用作常量/键表达式? mysql中是否有一种“eval”函数?

这个问题一直困扰着我很长一段时间,任何帮助都会非常棒。

节拍

3 个答案:

答案 0 :(得分:13)

不幸的是,MySQL期望INTERVAL之后的关键字而不是任何字符串或数值。您可以使用CASE语句实现所需,并为不同的案例提供不同的关键字。

例如,假设您要将具有适当单位的值添加到日期,那么SQL语句将如下所示:

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

顺便在WHERE子句中工作:)

答案 1 :(得分:7)

我认为你最好为单位列的每个可能值使用CASE语句,因为它是一个有限的宇宙。您可以选择是将列保留为varchar,还是使用整数代码。

即使从现有表生成,我也不鼓励使用动态执行的SQL语句,除非您在限制插入表中的值时要小心120%。如果你以某种方式在表格中得到以下值,你会怎么做?糟糕!

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

答案 2 :(得分:-3)

我正在我的机器上重新安装MySQL,所以我无法测试它,但如果允许CONCAT(),可能会将它们连接成一个有效的字符串可能会有所帮助:

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