动态更改mysql列类型

时间:2014-03-22 20:19:31

标签: php mysql sql email

是否可以在不改变的情况下即时更改列类型? 我有一个表格,其中包含电子邮件用户的expire_date列。类型如下:

ADDDATE(NOW(), INTERVAL 365 DAY)

所以这会返回如下内容:

+---------------------+
| expire_date         |
+---------------------+
| 2015-03-22 13:03:53 |
+---------------------+

但是,我试图在电子邮件到期之前发送30天通知,并附带一个php脚本。 我的select语句如下所示:

select email from new_users where SUBDATE(`expire_date`, INTERVAL 30 DAY) = CURDATE();

如您所见,我正在查询查询以检查expired_date时间戳记30天内的所有电子邮件。但这不会起作用,因为expire_date时间戳使用了我仍想保留的完整日期和时间戳。 CURDATE()只使用我需要的那一天,因为根据秒运行cron php脚本是不可能的。 select语句归结为:如果所选电子邮件的30天通知等于今天的日期,则向该用户发送电子邮件。如上所述,expired_date与CURDATE()不匹配,因为它包含实际时间。我想修改expired_date列以仅显示此查询的日期。这可能吗?

2 个答案:

答案 0 :(得分:0)

为什么不使用NOW();并直接与您的列进行比较,您无需转换为日期。

select email from new_users 
where SUBDATE(`expire_date`, INTERVAL 30 DAY) = NOW();

或使用DATE();到你的专栏。

 CURDATE() : // 2008-11-11
 NOW()     : // 2008-11-11 12:45:34
 CURTIME() : // 12:45:34

答案 1 :(得分:0)

您可以使用date()功能执行您想要的操作:

select email
from new_users
where SUBDATE(date(`expire_date`), INTERVAL 30 DAY) = CURDATE();

删除时间部分。

但是,编写查询的更有效方法是:

select email
from new_users
where expiredate >= adddate(curdate(), interval 30 day) and
      expiredate < adddate(curdate(), interval 31 day);

这可能看起来更复杂。但是,通过将函数调用移动到“常量”(CURDATE()),SQL引擎可以使用expiredate上的索引。