使用字段作为间隔的mysql日期

使用字段作为间隔的mysql日期,mysql,sql,Mysql,Sql,我需要mysql和date_sub()的帮助。我有一个叫桌活动 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 t

我需要mysql和date_sub()的帮助。我有一个叫桌活动

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
将警报拆分为两个字段

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

间隔后不允许使用字符串,您可以在一列上将所有警报限制转换为天

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();

虽然这个解决方案可以工作,但它并不是存储这些数据的最有效方式,因为每次查询这些数据时,MySQL都必须查看每行的间隔值,根据截止日期计算间隔值,然后返回答案

如果您在插入数据之前计算此信息,并将
alert\u date
存储为
date
列,那么(假设您也对其进行索引),MySQL将很快找到具有以下查询的行:

SELECT id FROM activity WHERE alert=CURRENT_DATE();
更高效(它允许查询缓存):


如果警报数量较少,您可以写出一个
案例

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月收到延迟警报,在12月收到提前警报。哦,是的,您是对的!谢谢,我删除了“月”关键字。将截止日期设置为天(:无需在单独的表字段中拆分警报。按如下方式拆分:WHERE CASE SUBSTRING_INDEX(警报),-1)WHEN'DAY'然后date_sub(截止日期,间隔子字符串_INDEX(警报),,1)DAY)。。。
SELECT id FROM activity WHERE alert="2011-04-23";
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();