select SQL 最近 X 天的 ID 如何确保不丢失值

How to be sure to not lose values when select the ID of last X days in SQL

向您介绍我的问题的背景:我想通过电子邮件接收 在最后 15 天.[=13= 中创建的东西的 ID 和创建日期]

我想在 PHP 中 每 15 天 调用一个函数。我通过创建一个 CRON 任务来做到这一点,该任务 触发 每个月 的第 1 天和第 16 天 。 这是我的请求 SQL 请求 :

SELECT ID,
       creation_date
FROM mytable
WHERE creation_date > DATE_SUB (NOW (), INTERVAL 16 DAY)

我担心 失去价值。这样做的好方法是什么? 谢谢

如果您想确保不丢失任何数据,我有一个 table 已经通知了 ID:

NotificationsLog
ID, batchGuid, batchDate

(批次日期仅供参考,此过程不需要)。在我的 php 中,我会制作一个新的 Guid,然后 运行 插入:

INSERT INTO Notifications 
SELECT t.ID, @guidFromPhp, NOW()
FROM mytable t
  LEFT JOIN notificationslog n on n.id = t.id
WHERE n.ID is null

这 select 获取所有新数据(新数据不在日志 table 中),这要归功于左连接查找 null。所有新数据都针对同一个批次 GUID 进行记录。

然后我会提取行并根据相同的 Guid 通过电子邮件发送它们:

SELECT t.ID, t.Whatever
FROM mytable t
  INNER JOIN notificationslog n on n.id = t.id
WHERE n.batchGuid = @guidFromPhp

这里不需要日期,也没有数据丢失;每次 运行 时,进程都会通过电子邮件发送所有未通过电子邮件发送的数据。如果您每 15 天 运行 它会执行最近 15 天的所有操作(除了第一个 tine 它 运行s。用所有当前数据预加载日志以避免这种情况)。如果您 运行 每 30 分钟获取一次最近 30 分钟的数据

如果存在发送电子邮件失败的风险,您可以使用状态增强日志 table(或者只是从 n 中删除该条目 - 接下来 运行 将再次拾取)

最简单的解决方案:

像这样在 table 中添加一列 isNotified :

| ID | creation_date | isNotified |
|----|---------------|------------|
| 1  | 2020-03-26    | 1          |
| 2  | 2020-04-09    | 0          |
| 3  | 2020-04-10    | 0          |

然后,将您的请求更新为 select 只有未发送的项目:

SELECT ID,creation_date FROM mytable WHERE isNotified=false
// Send your mail

如果发送成功,请更新列以将 isNotified 设置为 True,如下所示:

UPDATE mytable SET isNotified = true WHERE isNotified = false

设置 CRON 选项卡以触发每月 1st15th