2012-07-28 50 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