MySQL在函数中使用表列来创建用于排序的别名

时间:2012-08-23 11:05:59

标签: mysql select

听起来比实际更复杂。以下是我在SELECT部分​​中要做的事情:

SELECT TIMESTAMPADD(
          UCASE(
                 SUBSTRING(offset_unit,1,CHAR_LENGTH(offset_unit)-1)
                ),1,'2003-01-02') as offset_date

offset_unit 是数据库中的VARCHAR列。它包含以下之一:“小时”,“分钟”。

偏移是INT。

我正在尝试将offset_unit转换为大写,在我删除了最后一个字符('s')以便我可以有一个适当的间隔(MINUTE,HOUR ......)所以我可以得到一个我可以使用的日期在事后排序,但MySQL不断抛出错误。我已经通过一次添加一个函数来测试每个步骤,并且它只在我添加TIMESTAMPADD后失败。如果我手动输入MINUTE,那么它可以工作。

有什么方法可以让它发挥作用吗?

附加信息:我在CakePHP 1.3中运行它,在'fields'数组中的find中,但这不应该很重要。

2 个答案:

答案 0 :(得分:3)

这可以通过使用CASE WHEN子句轻松实现:

SELECT (CASE 
            WHEN offset_unit = 'HOURS' 
                   THEN TIMESTAMPADD(HOUR,`offset`,'2003-01-02')
            WHEN offset_unit = 'MINUTES' 
                   THEN TIMESTAMPADD(MINUTE,`offset`,'2003-01-02')
        END) AS offset_date
FROM my_table;

SEE SQLFIDDLE DEMO HERE

答案 1 :(得分:1)

它不起作用,因为TIMESTAMPADD不将字符串作为第一个参数,而是 unit 关键字,例如MINUTE。我的猜测是你需要分两步完成,首先获取单位然后用正确的关键字构造一个查询。