1

私は、1日に費やした金額などを記録するプロジェクトに取り組んでいます。データベースの開始日(最初のエントリ)が2013年1月1日であるとします。今は毎日データベースにエントリを送信しますが、日によってはできません。テーブルは次のようになります。

日付_____ _ | _ ___ ____使用済み

2013-01-09 | 2000

2013-01-11 | 1200

今日が2012年1月11日で、2012年1月10日にエントリを作成するのを忘れたとしましょう。次に、php + mysqlを使用してコードを記述します。これにより、テーブルが調べられ、最初のエントリと最新のエントリの間に欠落している日付がないかどうかが確認されます。また、2012年1月10日のエントリが欠落していることが判明した場合は、使用済み列に金額0のエントリ自体を作成する必要があります。どうすればこれを達成できますか?私が使おうとしているアプローチよりも良いアプローチはありますか?

4

4 に答える 4

2

これを実現する唯一の方法JOINは、完全なカレンダーを持つテーブルを作成するか、日付のテーブルを作成することです。カーソルを書くこともできますが、それは最後の手段と考えられています。

于 2013-01-11T16:23:43.973 に答える
1

これが私の提案です。スクリプト実行の最終日を保存するファイルを1つ作成します。今日(2013-01-11)実行した場合、そのファイルに2013-01-11を保存するよりも、そのスクリプトを実行したとします。明日もまた明日の日付2013-01-12を保存します。

この日付を使用してクエリを作成し、処理時間を短縮します。

ファイルに保存されている日付は$minDateであり、

クエリを使用してデータベースから最大日付を見つけ、それが$maxDateであると言います。

query:Select Date、Spent from table Where date('Date')> $ minDate;

結果を配列に格納します$dateArray

$minDateと$maxDateの間の期間を使用して1つの日付配列を作成します

$starting_date = new DateTime($minDate." 00:00");
$ending_date = new DateTime($maxDate." 23:59:59");


$interval = new DateInterval('P1D');
$period = new  DatePeriod($starting_date , $interval, $ending_date);
foreach ($period as $date) {
  $curDate=$date->format('Y-m-d');
  if(!in_array($curDate,$dateArray)){
     //insert new row with $curDate
  }
}
update lastProcessedDate in your file
于 2013-01-11T17:35:00.627 に答える
0

私はこのようにアプローチします:早朝(たとえば午前2時頃)にPHPスクリプトを実行するcronジョブを作成します。スクリプトは、現在の日付から1(昨日)を引いたものを取得し、データベースへの選択クエリを使用します。エントリが見つからない場合は、エントリを作成します。毎日実行しているときは、常に昨日のエントリがあることを確認します。

于 2013-01-11T16:46:28.883 に答える
0

ストアドプロシージャを作成し、夜間に実行するようにスケジュールすることができます。カーソルを作成してテーブルをループし、[日付]列で並べ替えてから、前のレコードをチェックして、欠落している日数を確認します(1を超える場合は、個別に挿入します)。

于 2013-01-11T16:27:34.907 に答える