0

2 つの固定タイムスタンプの間でランダムな日付を生成する方法を探しているときに、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);
}

ソースとクレジット

しかし、データベースに挿入する日付を生成するために使用したため、日付を順番に (開始日から終了日まで) 生成する方法を探しています。

問題は、私の投稿が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

4

2 に答える 2

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
  • 最後に、この日付で新しい行を挿入します。
于 2012-07-28T15:56:20.927 に答える
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 の各日付を null に設定する必要がありますupdate foo set date=null:)

また、myslq_query を使用しないでください。

于 2012-07-28T16:40:41.370 に答える