如何在 SQL 中保持特定小时范围内的随机 UNIX 时间戳?

问题描述 投票:0回答:1

我正在尝试做的事情:在 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 之间。

这就是我失败的地方。

我面临的限制是:

  • 它必须是unix时间戳(其他列和脚本取决于unix时间戳中的所有时间)
  • 这是一个经常运行并为用户分配随机时间的任务,这就是为什么要检查
    random_hour > current_timestamp() - 86400
    ,以便它稳定,这也是为什么我不能只在当天的时间戳范围上工作,
  • 我运行的数据库是 MariaDB 10
sql unix mariadb timestamp
1个回答
0
投票

为了满足在过去 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;
© www.soinside.com 2019 - 2024. All rights reserved.