【问题标题】:How to implement posting limit of a user?如何实现用户发帖限制?
【发布时间】:2009-10-22 04:03:10
【问题描述】:

一个用户一天内最多可以发帖4次。

困难在于如何在数据库中开始一天的工作?我使用的是 MySQL

【问题讨论】:

  • 您是否需要考虑用户和数据库之间的位置/时区差异?我的时区是 GMT +1h .. 你的,我敢打赌是不同的!

标签: sql mysql datetime


【解决方案1】:

如果你存储他的 TimeZone 会更好。世界不同地区的人们有不同的时间,因此每个人的一天开始时间会有所不同。

您可以获得当前日期和当前时间。检查从当天开始00:00 在这一特定天发布了多少帖子。如果数字等于 4,则告诉用户他已达到最大限制。

使用NOW()可以获取当前日期和时间

mysql> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2009-10-22 10:49:15 |
+---------------------+
1 row in set (0.00 sec)

您必须知道您的服务器位于哪个时区,然后将时间设为 UTC 并添加/减去时间以获得用户的本地时间。

您可能想看看MySQL Data and time Reference

如何在数据库中开始一天的工作

这应该不是问题,正如我所说,从数据库获取当前时间,调整您的时差以使时间为 UTC。然后调整用户的时区,使时间按照他的时区。

例如3:30(服务器时间) - 1:00(服务器时区) + 5:30(用户时区) = 8:00(用户时间)

因此,该用户一天的开始时间是 00:00,并且该用户已经过 8 小时。

注意:注意时差。例如2:30 - 3:30 = -1:00 表示前一天的 23:00。也要考虑到这一点。

【讨论】:

    【解决方案2】:

    这将获得基于今天的记录:

    SELECT * FROM whatever WHERE date(datefield) = CURdate();
    

    【讨论】:

    • 我认为在处理 TimeZones 时也需要特别小心。
    • 如果/当您的数据库变大时,您将需要删除类型转换日期(日期字段)并改用日期字段 > CURDATE()。
    【解决方案3】:
    SELECT datetime FROM posts ORDER BY date LIMIT 3,1
    
    if now - datetime >= 86400:            // pick one
    if datetime.datepartonly < today:
        allow posting
    else:
        deny posting
    

    如果您确定您的 MySQL 服务器的时间设置正确:

    SELECT COUNT(*) FROM posts WHERE DATE_SUB(NOW(), 1 day) <= datetime; // OR
    SELECT COUNT(*) FROM posts WHERE CURRENT_DATE() <= datetime;
    if count < 4:
        allow
    else:
        deny
    

    【讨论】:

      【解决方案4】:

      与其专注于一天,为什么不在 24 小时滚动期间限制为 4 个帖子?即,第 4 个最旧的帖子应该与最近的帖子相隔 24 小时以上。

      【讨论】:

        猜你喜欢
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多