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

这是我的建议,创建一个文件来存储脚本运行的最后日期,假设今天(2013 年 1 月 11 日)您已经运行了该脚本,而不是仅在该文件中存储 2013 年 1 月 11 日,如果您运行明天再次,它将存储明天的日期 2013-01-12。

我们将使用这个日期来创建查询并减少我们的处理时间。

存储在文件中的日期是我们的 $minDate,

使用查询从数据库中找出最大日期,说它是 $maxDate,

查询:Select Date,Spent from table where date('Date')>$minDate;

将结果存储在数组中 $dateArray

使用 $minDate 和 $maxDate 之间的期间创建一个日期数组

$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

您可以创建一个存储过程并安排它每晚运行。像创建游标来循环遍历表,按日期列排序,然后检查上一条记录以查看缺少多少天,如果超过 1,则单独插入。

于 2013-01-11T16:27:34.907 回答
0

我会这样处理:创建一个 cronjob,它在清晨(比如凌晨 2 点左右)运行你的 PHP 脚本。该脚本将当前日期减去 1(昨天)并使用对数据库的选择查询。如果它没有找到一个条目,它将创建一个。当您每天运行它时,您将确保总有昨天的条目。

于 2013-01-11T16:46:28.883 回答