是否可以在不改变的情况下即时更改列类型? 我有一个表格,其中包含电子邮件用户的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列以仅显示此查询的日期。这可能吗?
答案 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
上的索引。