【问题标题】:Insert/ Update random date in MySQL在 MySQL 中插入/更新随机日期
【发布时间】:2011-05-31 13:46:14
【问题描述】:

如何使用 MySQL 在过去 2 周内更新具有随机日期的列?

例如(代码实际上不起作用):

UPDATE mytable
SET col = sysdate() - rand(1, 14);

【问题讨论】:

    标签: mysql sql date random


    【解决方案1】:

    您的主要问题是RAND() 不允许您指定的值范围。它总是会返回一个介于 0 和 1 之间的值。

    我现在无法制定 1..14 随机解决方案,但为了让您开始,这将选择过去 10 天内的随机日期:

    SET col = DATE(DATE_SUB(NOW(), INTERVAL ROUND(RAND(1)*10) DAY)) 
    

    【讨论】:

    • RAND(seed),种子是可选的。如果指定了种子,它将返回一个可重复的随机数序列。如果未指定种子,则返回完全随机数。因此,您的 RAND(1) 将始终返回相同的值(至少对于 MYSQL)
    【解决方案2】:
    UPDATE mytable
    SET col = CURRENT_DATE - INTERVAL FLOOR(RAND() * 14) DAY
    

    这会将col 设置为当前日期和当前日期之间(包括)的日期 - 13 天。乘以 15 得到当前日期 - 14 天。

    【讨论】:

      【解决方案3】:

      你可以用这个表达式得到一个随机整数:

      获取随机整数R 范围 i FLOOR(i + RAND() * (j - i))。为了 例如,要获得一个随机整数 范围 7

      SELECT FLOOR(7 + (RAND() * 5));
      

      https://dev.mysql.com/doc/refman/8.0/en/mathematical-functions.html#function_rand

      使用它来生成随机的天数、小时数或分钟数(取决于分辨率)并将该数字添加到当前日期。

      完整的表达式是:

      -- Date only
      SELECT CURRENT_DATE - INTERVAL FLOOR(RAND() * 14) DAY;
      
      -- Date and time
      SELECT CURRENT_TIMESTAMP - INTERVAL FLOOR(RAND() * 14 * 24 * 60 *60) SECOND;
      

      Demo

      【讨论】:

      • 这是一个非常古老的答案和一个非常古老的问题,但这解决了我必须引入 300 多个随机日期的问题。谢谢!
      • @IsmaelMiguel,这实际上是一种非常间接的方式。使用时间戳stackoverflow.com/a/28944156/632951,更直接,更不容易出错。
      • @Pacerier - 这两种方法对我来说都很好(而且非常相似)。您想到了哪些潜在的错误?
      • @Pacerier 您的建议确实很强大,但我想要的只是一个非常基本且快速的原型。日期的准确性不是必需的。我只需要随机日期。
      • @ÁlvaroG.Vicario,当我们需要将“过去 2 周”更改为“过去 2 个月”等其他内容时。我的解决方案更直接且可扩展到所有用例,因为它只是指定一个 start_date 和一个 end_date。
      【解决方案4】:

      一个简单的选择是使用这个查询:

      UPDATE mytable
      SET col = (
          NOW() - INTERVAL FLOOR(RAND() * 14) DAY 
          + INTERVAL FLOOR(RAND() * 23) HOUR
          + INTERVAL FLOOR(RAND() * 59) MINUTE
          + INTERVAL FLOOR(RAND() * 59) SECOND
      );
      

      或者,更优雅:

      UPDATE mytable
      SET col = (NOW() - INTERVAL FLOOR(RAND() * 14 * 24 * 60 * 60) SECOND);
      

      【讨论】:

        猜你喜欢
        • 2016-05-16
        • 2022-10-02
        • 2012-06-03
        • 1970-01-01
        • 1970-01-01
        • 2012-08-08
        • 1970-01-01
        • 2013-08-10
        • 1970-01-01
        相关资源
        最近更新 更多