表里面一个datetime类型的时间字段。格式当然为 2009-01-01 13:11:01表里大概有2万多条记录。我想用sql语句将这个时间字段随机替换掉。随机时间开始 2009-01-01 00:01:01
随机时间结束 2009-05-10 20:59:59不知道用sql是否能实现啊。该怎么写呢?

解决方案 »

  1.   

    mysql> SET @begin_date='2009-01-01 00:01:01';
    Query OK, 0 rows affected (0.00 sec)mysql> SET @end_date='2009-05-10 20:59:59';
    Query OK, 0 rows affected (0.00 sec)mysql> SET @second = TIMESTAMPDIFF(second,@begin_date,@end_date);
    Query OK, 0 rows affected (0.00 sec)mysql> SELECT @second;
    +----------+
    | @second  |
    +----------+
    | 11221138 |
    +----------+
    1 row in set (0.00 sec)mysql> UPDATE tb SET
        ->     `date` = TIMESTAMPADD(second,RAND()*@second,'2009-01-01 00:01:01');
    Query OK, 20000 rows affected (0.13 sec)
    Rows matched: 20000  Changed: 20000  Warnings: 0
      

  2.   

    多谢 小梁。不过有点不明白。为什么间隔是这个呢:RAND()*@second
      

  3.   

    RAND() 产生的是一个0 <= v < 1.0的小数。所以需要用小梁的方法先计算差,然后乘上这个总秒数之后加上起始日期。http://dev.mysql.com/doc/refman/5.1/zh/functions.html
    RAND() RAND(N) 
    返回一个随机浮点值 v ,范围在 0 到1 之间 (即, 其范围为 0 ≤ v ≤ 1.0)。若已指定一个整数参数 N ,则它被用作种子值,用来产生重复序列。  若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1))。例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机整数, 可使用以下语句:SELECT FLOOR(7 + (RAND() * 6));