MySQL需要在20年到90年之间的列中添加随机日期

时间:2014-09-05 19:51:32

标签: mysql date random

用作随机生日。需要生成日期。 我用过这个但是没有用。

UPDATE table SET column=FROM_UNIXTIME(ROUND((RAND() * (2838240000 - 630720000) + 630720000)));

2 个答案:

答案 0 :(得分:2)

您的随机值超过了签名的unix时间戳的最大值,为2 ^ 31:

2^31 =  2,147,483,648

MariaDB [test]> select from_unixtime(2147483648), from_unixtime(2147483647);
+---------------------------+---------------------------+
| from_unixtime(2147483648) | from_unixtime(2147483647) |
+---------------------------+---------------------------+
| NULL                      | 2038-01-18 21:14:07       |
+---------------------------+---------------------------+
1 row in set (0.00 sec)

换句话说,你正在遭遇Y2038k问题。

e.g。

MariaDB [test]> select ROUND((RAND() * (2838240000 - 630720000) + 630720000));
+--------------------------------------------------------+
| ROUND((RAND() * (2838240000 - 630720000) + 630720000)) |
+--------------------------------------------------------+
|                                             2234566951 |
+--------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [test]> select from_unixtime(2234566951);
+---------------------------+
| from_unixtime(2234566951) |
+---------------------------+
| NULL                      |
+---------------------------+
1 row in set (0.00 sec)

答案 1 :(得分:1)

@Gordon Linoff有正确的方法。

假设"在20到90年之间"意味着从今天的当前日期开始,与今天的日期之前的90年相同,再加上随机天数(0到70 * 365之间)

我使用DATE(NOW())返回当前日期,然后减去90年,然后添加一个随机天数。我将使用此表达式(将此返回值分配给UPDATE语句中的列)。这对我来说更容易破译。

UPDATE mytable
   SET col = DATE(NOW()) + INTERVAL -90 YEAR + INTERVAL RAND()*70*365.25 DAY

如果"在20到90年之间"指定一些特定范围的日期值,然后使用一个表达式返回" start"该范围作为DATE值,并添加一个0到70年范围内的随机间隔(以天为单位)。