mysql date_sub使用字段作为间隔

时间:2011-04-23 21:44:52

标签: mysql sql

我需要mysql和date_sub()的帮助。我有一个表调用Activity

Activity(id,deadline,alert)
Activity(1,'2011-04-18','1 DAY');
Activity(2,'2011-04-13','1 MONTH');

A中的每一行都有一个“警报”,此字段指示活动必须报告的截止日期之前的时间。

例如

On 2011-04-17 I have to report the activity with 'id' 1
On 2011-03-14 I have to report the activity with 'id' 2

我尝试使用date_sub()函数,但我不能使用字段作为此函数的参数。知道如何解决这个问题吗?

SELECT * 
  FROM `activities` 
 WHERE date_sub(`deadline`, INTERVAL alert) >= CURDATE();

4 个答案:

答案 0 :(得分:2)

将警报拆分为2个字段

Alert_count: integer
Alert_period: enum('hour','day','month','week')

并像这样更改查询:

SELECT * 
  FROM `activities` 
 WHERE CASE alert_period 
   WHEN 'hour' THEN date_sub(`deadline`, INTERVAL alert_count HOUR) >= CURDATE();
   WHEN 'day' THEN date_sub(`deadline`, INTERVAL alert_count DAY) >= CURDATE();
   ...
 END CASE

答案 1 :(得分:2)

如果提醒的数量很少,您可以写出case

WHERE case 
      when alert = '1 DAY' then date_sub(`deadline`, INTERVAL 1 DAY) 
      when alert = '1 MONTH' then date_sub(`deadline`, INTERVAL 1 MONTH) 
      ... etc ...
      end >= CURDATE();

答案 2 :(得分:0)

INTERVAL后不允许使用字符串,您可以将所有警报限制转换为一列上的日期。

Activity(id,deadline,alert)
Activity(1,'2011-04-18','1');
Activity(2,'2011-04-13','30'); 

并用作:

SELECT * 
  FROM `activities` 
 WHERE date_sub(`deadline`, INTERVAL alert DAY) >= CURDATE();

答案 3 :(得分:0)

虽然这个解决方案可行,但它不是存储此数据的最有效方式,因为每次查询此数据时,MySQL必须查看每一行中的间隔值,根据截止日期计算它,然后返回答案。 / p>

如果您在插入数据之前计算此信息并将alert_date存储为DATE列,那么(假设您也将其编入索引),MySQL发现它的速度非常快带有查询的行:

SELECT id FROM activity WHERE alert=CURRENT_DATE();

更高效(它允许它被查询缓存):

SELECT id FROM activity WHERE alert="2011-04-23";