我正在尝试做的事情:在 SQL 中,我试图在过去 24 小时的特定小时范围内分配一个随机的 UNIX 时间戳。
到目前为止我得到的是:
第 1 步 使用“0”占位符 - 确保仅针对当天未分配随机时间的用户更改 unix 时间戳的小时。
UPDATE users SET random_hour = 0 WHERE random_hour > (CURRENT_TIMESTAMP() - 86400);
第2步: 使查询实际上生成最近 24 小时内的随机时间戳。
UPDATE users SET random_hour = UNIX_TIMESTAMP((CURRENT_TIMESTAMP() - INTERVAL FLOOR(RAND() * 24 * 60 * 60) SECOND)) WHERE random_hour > (CURRENT_TIMESTAMP() - 86400);
第3步: 确保分配的时间在 8:00-16:00 GMT 之间。
这就是我失败的地方。
我面临的限制是:
random_hour > current_timestamp() - 86400
,以便它稳定,这也是为什么我不能只在当天的时间戳范围上工作, 为了满足在过去 24 小时内特定时间范围(8:00-16:00 GMT)内分配随机 UNIX 时间戳的要求,我们可以调整逻辑以确保生成的时间戳落在该窗口内。考虑到约束条件和您已采取的步骤,这里有一种方法,该方法考虑 GMT 时区并确保随机时间在 8:00-16:00 GMT 之间,同时使用 UNIX 时间戳。
首先,了解 UNIX 时间戳采用 UTC 格式非常重要。当您想要将时间限制为 8:00-16:00 GMT 时,您实际上是在 UTC 中指定特定的小时范围,这简化了任务,因为不需要时区转换。
8:00-16:00 GMT 之间的秒数范围为 (8 * 3600) 到 (16 * 3600),即从一天开始算起的 28800 到 57600 秒。为了满足您的要求,您需要首先找到 GMT 当天开始的 UNIX 时间戳,然后添加指定范围内的随机偏移量。
该方法涉及:
计算 GMT 当天的开始时间作为 UNIX 时间戳。 生成添加到此开始时间的随机秒数,限制在 28800 到 57600 秒之间。 应用此逻辑仅更新相关用户的 random_hour。 你可以这样写:
-- Step 1: Reset random_hour for eligible users
UPDATE users
SET random_hour = 0
WHERE random_hour > (UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - 86400);
-- Step 2: Update random_hour with a new value within the 8:00-16:00 GMT range
UPDATE users
SET random_hour = UNIX_TIMESTAMP(CURRENT_DATE()) + 28800 + FLOOR(RAND() * (57600 - 28800))
WHERE random_hour = 0;