【发布时间】:2014-10-30 19:56:08
【问题描述】:
用作随机生日。 只需要要生成的日期。 我用过这个,但不工作。
UPDATE table SET column=FROM_UNIXTIME(ROUND((RAND() * (2838240000 - 630720000) + 630720000)));
【问题讨论】:
用作随机生日。 只需要要生成的日期。 我用过这个,但不工作。
UPDATE table SET column=FROM_UNIXTIME(ROUND((RAND() * (2838240000 - 630720000) + 630720000)));
【问题讨论】:
@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 年之间”指定了某个特定的日期值范围,则使用返回该范围“开始”作为 DATE 值的表达式,并添加一个随机间隔(以天为单位),即0 到 70 年的范围。
【讨论】:
您的随机值超过了带符号的 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 问题。
例如
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)
【讨论】:
FROM_UNIXTIME 函数的 32 位有符号整数值问题/限制。 MySQL DATE 数据类型的值范围比 TIMESTAMP 类型大得多。