2012-07-28 46 views
0

我发现原来这巨大作用,同时寻找一种方式来产生两个固定时间戳之间的随机日期:PHP/MySQL的指令的随机日期

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,所以在插入数据库时​​排序日期是唯一的解决方案。

更新:

这是我尝试使用madfriend代码,但所有日期在哪里我都出了错一样吗?

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

+0

你的意思是与帖子ID同步吗?你能提供更多信息吗? – drupality 2012-07-28 15:46:34

+0

@drupality他意味着更大的ID的帖子应该有更大的时间戳 – madfriend 2012-07-28 15:47:05

+0

@Anna Riekic'如此排序数据库中插入的日期是唯一的解决方案',可能是这阻碍了你。 – 2012-07-28 15:57:03

回答

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设置为最后添加的帖子的日期。
  • 最后,在此日期插入新行。
+0

madfriend,请参阅更新在op – 2012-07-28 16:32:25

+0

@AnnaRiekic原因日期是一样的是,你的'更新'没有'where'语句,所以每个查询都会影响* all *行。 – madfriend 2012-07-29 12:08:56

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)"; 

(对于工作,你需要设置在每个日期db开始更新之前为空:update foo set date=null

你也不应该使用myslq_query ..

+0

嗯...不,我想更新所有的行,但有序的日期 – 2012-07-28 16:50:05

+0

这段代码是这样做的。 – Louis 2012-07-30 11:54:40