0

我有一个带有列的表,id_user它可以是有效的or 。它基本上存储是否已发送某些东西。to_sentsent_datetimeDATETIMENULL

我每 24 小时只能发送 5 个,因此在该查询中,我需要知道哪个id_userto_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 小时的那些。

4

1 回答 1

2

有两件事要检查:

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

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

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

所以,你可以试试这个:

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 小时而不是日历中的一天。

于 2012-05-15T15:22:38.047 回答