0

听起来比实际上要复杂得多。这是我在 SELECT 部分中尝试做的事情:

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

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

偏移量是一个 INT。

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

有什么办法让这个工作?

附加信息:我在 CakePHP 1.3 中运行它,在 'fields' 数组中的一个查找中,但这不应该是重要的。

4

2 回答 2

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;

在此处查看 SQLFIDDLE 演示

于 2012-08-23T11:23:05.637 回答
1

它不起作用,因为TIMESTAMPADD第一个参数不是字符串,而是单位关键字,例如MINUTE. 我的猜测是,您需要分两步执行此操作,首先获取单元,然后使用正确的关键字构造查询。

于 2012-08-23T11:22:53.087 回答