mysql - 选择timestampdiff超过1天并且有一些null的地方

标签 mysql

我有一个表,其中包含 id_userto_sentsent_datetime 列,这些列可以是有效的 DATETIMENULL。它主要存储是否已发送某些内容。

我每 24 小时只能发送 5 个,因此在该查询中我需要知道哪个 id_user 有一些 to_sent=1 内容,并且在过去 24 小时内没有发送任何内容小时。 to_sent=1 可能也会有一个 sent_datetime=NULL 但我不知道如何处理它。

稍后发送,只要有不同的id_user就可以了。

我已经尝试过

SELECT id_user
FROM send
WHERE
    to_sent=1
    AND (TIMESTAMPDIFF(DAY, sent_datetime, NOW()) < 1)
GROUP BY id_user
ORDER BY updated_datetime;

但我不仅仅收到距上次发送内容已超过 24 小时的邮件。

最佳答案

有两件事需要检查:

  1. 确保处理 sent_datetime 为 null 的情况,否则 TIMESTAMPDIFF 将返回 NULL。我不确定这是否是一个问题。

  2. 确保 TIMESTAMPDIFF 返回的值不是负数。如果是,则反转表达式中的 NOW()sent_datetime

  3. 尝试在 select 语句中添加此表达式,以便可以看到结果。

所以,你可以试试这个:

SELECT id_user, TIMESTAMPDIFF(DAY, sent_datetime, NOW())
FROM send
WHERE
    to_sent=1
    AND (TIMESTAMPDIFF(DAY, sent_datetime, NOW()) < 1)
    AND sent_datetime IS NOT NULL
GROUP BY id_user
ORDER BY updated_datetime;

最后,你需要这个:

SELECT id_user
FROM send
WHERE
    to_sent=1
    AND (TIMESTAMPDIFF(DAY, sent_datetime, NOW()) >= 1
         OR sent_datetime IS NULL)
GROUP BY id_user
ORDER BY updated_datetime;

另外,这使得差异的精确度达到一天。您可能想将其更改为:TIMESTAMPDIFF(HOUR, sent_datetime, NOW()) >= 24 或分钟,或其他。如果您想要的是 24 小时而不是日历中的一天。

关于mysql - 选择timestampdiff超过1天并且有一些null的地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10603734/

相关文章:

MySQL 如何使用 CASE 语句作为列而不是行按日期进行分组

php - 如何实现分页?

mysql - 更新后重新加载 vagrant

php - 使用插入 PDO 检索值

mysql - 如何在mysql中存储一个2D游戏世界

php - Codeigniter 使用 join 进行搜索

mysql - SQL 中两个表的交集

Mysql 替换所有 id 以形成正确的序列

mysql - Sphinx 值得用于非全文搜索吗?

mysql - 用于减少空间和提高性能的最佳 mysql 数据类型