【发布时间】:2018-08-03 00:34:30
【问题描述】:
我有一个查询特定日期数据的 SQL 查询。例如在01.01.2018 和20.01.2018 之间。但是,如果某些日期没有任何数据,例如01.01.2018、02.01.2018、19.01.2018 和20.01.2018,我的 SQL 查询将不会返回这些日期。 03.01.2018 到 18.01.2018 之前只有一个 SQL 返回。
现在我的问题来了。即使我的日期的开头和结尾没有数据,我仍然想将这些日期添加到数组中并为日期添加 0。因此,用户仍然知道“好吧,01.01.2018、02.01.2018、19.01.2018 和 20.01.2018 上没有任何数据。
但是我该怎么做呢?这是我拥有的数据以及我通过 SQL 查询获得的数据的示例
$fromDate = '01.01.2018';
$toDate = '20.01.2018';
returned would be 2 columns with those data:
03.01.2018 - 5
04.01.2018 - 2
06.01.2018 - 8
07.01.2018 - 6
08.01.2018 - 10
09.01.2018 - 1
10.01.2018 - 6
13.01.2018 - 7
14.01.2018 - 2
16.01.2018 - 5
17.01.2018 - 7
18.01.2018 - 1
data 数组包含日期,clicks 数组包含该日期的点击次数。两个数组的顺序非常重要,因为例如关键 5 是返回 datas 数组的日期和 clicks 数组中该日期的点击量。
我已经知道如何填补日期之间的空白。但我只是不知道如何填补 SQL 查询的开始日期和第一个返回日期与 SQL 查询的最后日期和最后一个返回日期之间的空白。
这是我的代码,用于填补第一个日期和最后一个日期之间的空白。例如,由于 SQL 查询没有返回 05.01.2018、11.01.2018、12.01.2018 和 15.01.2018 的值,因此这些日期将被添加到数据数组和 clicks 数组中(点击次数为 0数组)。
但正如我已经问过的,我如何才能对 SQL 查询的开始日期和第一个返回日期以及 SQL 查询的最后一个日期和最后一个返回日期执行此操作?
// assume the first element is right
$fixed_data = array($data[0]);
$fixed_clicks = array($clicks[0]);
for ($i = 1; $i < count($data); $i++) {
echo "Going through " . $data[$i] . "\n";
// if there is a gap, fill it (add 0s to corresponding array)
while (date('d.m.Y', strtotime(end($fixed_data) . ' + 1 day')) != $data[$i]) {
$fixed_data[] = date('d.m.Y', strtotime(end($fixed_data) . ' + 1 day'));
$fixed_clicks[] = 0;
echo "Added " . date('d.m.Y', strtotime(end($fixed_data) . ' + 1 day')) . "\n";
}
// add the data which exists after gap
$fixed_data[] = $data[$i];
$fixed_clicks[] = $clicks[$i];
}
foreach ($fixed_data as $key => $var) {
$fixed_data[$key] = (string)$var;
}
foreach ($fixed_clicks as $key => $var) {
$fixed_clicks[$key] = (string)$var;
}
$leadsArray[] = array(array("daten" => $fixed_data), array("anzahl" => $fixed_clicks));
var_dump($leadsArray);
【问题讨论】:
-
如果数据库包含所有日期会更容易。 :)
-
我知道,但这根本不可能,而且浪费空间
-
如果返回值为 0 或为空,你不能返回 'no date' 吗?
标签: php mysql arrays sorting date