【问题标题】:Change mysql column type on the fly即时更改mysql列类型
【发布时间】:2014-03-22 20:19:30
【问题描述】:

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

ADDDATE(NOW(), INTERVAL 365 DAY)

所以这会返回如下内容:

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

但是,我尝试在电子邮件过期前使用 php 脚本发送 30 天通知。 我的选择语句如下所示:

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

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

【问题讨论】:

    标签: php mysql sql email


    【解决方案1】:

    您可以使用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 上的索引。

    【讨论】:

    • 漂亮!我通过使用 EXTRACT 代替日期来尝试类似的事情,但后来无法弄清楚如何提取日期。非常感谢您的帮助。谢谢!
    【解决方案2】:

    为什么不使用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
    

    【讨论】:

    • 我确实尝试过NOW(),但由于这个 cron 在每日 cron 中运行,它可能会错过那个时间戳,因为它一直基于秒,对于每日 cron 来说是不切实际的。 DATE() 方法更实用,因为我只想要日期部分,因此 cron 可以在一天中的任何时间运行并且它仍然可以工作!非常感谢你们的帮助。
    猜你喜欢
    • 2014-07-05
    • 2019-02-04
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    相关资源
    最近更新 更多