我们得到了下表mytable
:
+----+------------+------------+
| id | created | expired |
+----+------------+------------+
| 1 | 1496476314 | NULL |
| 6 | 1496477511 | NULL |
| 7 | 1496477518 | NULL |
| 12 | 1496477534 | NULL |
| 13 | 1496477536 | NULL |
| 15 | 1496477541 | NULL |
| 21 | 1496477548 | NULL |
| 22 | 1496477550 | NULL |
| 26 | 1496477565 | NULL |
| 28 | 1496477566 | NULL |
| 29 | 1496477583 | NULL |
+----+------------+------------+
我们想要执行以下操作:
set expired = created + random(15 - 30 minutes) as unix_timestamp where expired is null;
我目前不知道这样做了。 如果你能给我一些想法,那就可以节省我的一天。
我尝试将created
时间戳转换为date_time并将该date_time添加到所需的15 - 30分钟,最后将new_date_time转换回unix_timestamp,但应该有更简单的方法。
答案 0 :(得分:2)
如果你想在14到33之间添加一个随机的分钟数,你可以这样做:
SET expired = DATE_ADD(created, INTERVAL 14 + RAND()*(33-14) MINUTE);
如果您想要秒数粒度,则需要添加SECOND类型的间隔:
SET expired = DATE_ADD(created, INTERVAL 14*60 + RAND()*(33-14)*60 SECOND);
如果您的过期列有DATETIME
,这将节省一个日期时间转换,这会使记录过期(WHERE过期< NOW())稍微容易一些。如果你有一个包含Unix时间戳的整数,那么Darshan的回答是肯定的方式,你可以在应用程序中计算Unix时间戳,然后插上它在查询中:
WHERE expired <= 123456789
在该列上建立索引会使到期时间过得非常快。我认为它可能比datetime方法更快,但它只是一种感觉,我还没有真正检查过。
答案 1 :(得分:1)
unix_timestamp
是自1970年1月1日以来经过的秒数。现在,如果您想要添加15到30分钟,那么等效秒数将是900到1800.这是您可以做的:< / p>
set expired = created + ROUND((RAND() * (900))+900) where expired is null;
这是它的工作原理:
RAND()
将生成0到1之间的随机数RAND() * (maximum - minimum)) + minimum
,我们确保生成900到1800之间的数字。ROUND
然后将该数字舍入到最近的int。