我有一个表,其中包含 id_user
、to_sent
和 sent_datetime
列,这些列可以是有效的 DATETIME
或 NULL
。它主要存储是否已发送某些内容。
我每 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 小时的邮件。
最佳答案
有两件事需要检查:
确保处理
sent_datetime
为 null 的情况,否则TIMESTAMPDIFF
将返回NULL
。我不确定这是否是一个问题。确保
TIMESTAMPDIFF
返回的值不是负数。如果是,则反转表达式中的NOW()
和sent_datetime
。尝试在 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/