【问题标题】:MySQL need to add random dates in a colum between 20 years and 90 yearsMySQL 需要在 20 年到 90 年之间的列中添加随机日期
【发布时间】:2014-10-30 19:56:08
【问题描述】:

用作随机生日。 只需要要生成的日期。 我用过这个,但不工作。

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

【问题讨论】:

    标签: mysql date random


    【解决方案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 年之间”指定了某个特定的日期值范围,则使用返回该范围“开始”作为 DATE 值的表达式,并添加一个随机间隔(以天为单位),即0 到 70 年的范围。

    【讨论】:

    • 成功了!谢谢各位,真的很有帮助。干杯!
    【解决方案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 问题。

    例如

    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。为了很好地解释FROM_UNIXTIME 函数的 32 位有符号整数值问题/限制。 MySQL DATE 数据类型的值范围比 TIMESTAMP 类型大得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多