php / mysql订购了随机日期

时间:2012-07-28 15:41:19

标签: php mysql date

我在SO上发现了这个很棒的功能,同时寻找一种在两个固定时间戳之间生成随机日期的方法:

 function randomDate($start_date, $end_date)
{
    // Convert to timestamps
    $min = strtotime($start_date);
    $max = strtotime($end_date);

    // Generate random number using above bounds
    $val = rand($min, $max);

    // Convert back to desired date format
    return date('Y-m-d H:i:s', $val);
}

Source and credit

但是我正在寻找一种方法来按顺序生成日期(开始日期到结束日期),因为我已经用它来生成插入数据库的日期。

问题是我的帖子是ORDER BY id DESC并且使用“原样”功能是因为它们是随机的,日期最终不同步。

即:

post id 4 - date = 2010-07-11 14:14:10
post id 3 - date = 2012-02-22 18:23:21
post id 2 - date = 2011-03-17 13:52:47
post id 1 - date = 2011-08-14 15:33:50

我需要他们与帖子ID同步。

现在您在考虑为什么不将查询更改为ORDER BY date DESC? ......好吧,这会占用我已编写的99%的代码,因为有其他列/行依赖于ORDER BY id DESC,因此在插入数据库时​​排序日期是唯一的解决方案。

更新

这是我尝试使用疯狂的代码,但是所有的日期都与我出错的地方相同?

function randomDate($startdate, $enddate){
 $min = strtotime($startdate);
 $max = strtotime($enddate);
 $val = rand($min, $max);
 return date('Y-m-d H:i:s', $val);
}

$query = "SELECT * FROM foo";
$num   = mysql_num_rows(mysql_query($query));

$randate = randomDate('2010-07-12 09:13:40', '2012-06-12 09:13:40');

$dates = array($randate);
for ($i = 0; $i < $num; $i++) {
    $dates[] = randomDate($startdate, $enddate);
}
sort($dates);
while($date = array_shift($dates)) {

$update = "UPDATE foo SET date='{$date}'";
 mysql_query($update);

}

加上得到 Notice: Undefined variable: startdate

2 个答案:

答案 0 :(得分:2)

我不确定您是在谈论创建或修改现有行。

更新:这里的基本想法非常简单。首先,使用SELECT COUNT(*) FROM your_posts_table查询计算帖子数量。之后:

// $num is number of posts
$dates = array();
for ($i = 0; $i < $num; $i++) {
    $dates[] = randomDate($startdate, $enddate);
}
sort($dates); // Sort dates in ascending order
while($date = array_shift($dates)) {
    // now $date won't be lower than it was in previous iterations.
    // use it to update your table
}

插入:如果您正在谈论插入并希望将最新的发布日期随机但最大,那么这就是您所做的:

  • 首先,选择上次添加的发布日期。
  • 其次,在randomDate设置为上次添加帖子的日期时致电$startdate
  • 最后,插入包含此日期的新行。

答案 1 :(得分:0)

function randomDate($startdate, $enddate){
 $min = strtotime($startdate);
 $max = strtotime($enddate);
 $val = rand($min, $max);
 return date('Y-m-d H:i:s', $val);
}

$query = "SELECT * FROM foo";
$num   = mysql_num_rows(mysql_query($query));

$randate = randomDate('2010-07-12 09:13:40', '2012-06-12 09:13:40');

$dates = array($randate);
for ($i = 0; $i < $num; $i++) {
    $dates[] = randomDate($startdate, $enddate);
}
sort($dates);
while($date = array_shift($dates)) {

此查询一次更新所有行:

$update = "UPDATE foo SET date='{$date}' ";
 mysql_query($update);

}

可能想要使用

$update = "update foo set date='{$date}' where id = (select id from foo where date is not null order by id limit 1)";

(为此,您需要在开始更新之前将数据库中的每个日期设置为null:update foo set date=null

另外你不应该使用myslq_query ..