我一次又一次地遇到这个问题;
场合 有一个(大)数据集,其记录与日期(甚至时间)相关联,我需要随时间绘制这些数据。
问题 数据集只包含有可用记录的日期(显然),但我还需要“空”'日期能够随着时间的推移均匀地绘制多个系列。
工具 我通常使用MySQL和PHP,最常将数据粘贴到Excel中以绘制图形等。
解决方法 到目前为止,我通常会创建一个excel表并手动输入日期,并使用数据集上的SumIf确定适当的结果数。 这对我来说似乎有点愚蠢,并且在处理大量记录时并不是真的可行(excel非常快速地变得非常慢)。
我真的很好奇,看看有没有真实的'更好的解决方案,可能已经在构建查询?
答案 0 :(得分:2)
您的日期是否优于看起来像日期的数据文本,或格式化为日期的日期序列号?
如果日期数据点是日期序列号,那么无论各个数据点之间的间隔如何,该图都将使X轴均匀分布
附图反映:第一列和图是“日期”存储为文本,第二个日期序列号格式化为日期
答案 1 :(得分:1)
一个明显的解决方案是创建一个包含该范围内每个日期的表格,并选择与此相关的数据:
CREATE TABLE days ( day DATE NOT NULL, PRIMARY KEY day );
INSERT INTO days (day) VALUES (20110101);
INSERT INTO days (day) VALUES (20110102);
....
SELECT days.day, yourtable.*
FROM days LEFT JOIN yourtable
ON days.day=yourtable.day;
或者你可以使用PHP注入缺少的日子(但我认为jupaju的代码存在相当缺陷):
// ensure your qry returns DATE_FORMAT(day, '%Y-%m-%d') AS day
$lastday='';
while ($r=mysql_fetch_assoc($qry_result)) {
if (!$lastday) $lastday=$r['day'];
while ($r['day']>$lastday) {
print $lastday . "\n";
$lastday=add_day($lastday);
}
unset($r['day']);
print $lastday . ',' . implode(',', $r) . "\n";
}
function add_day($day)
{
list($yr, $mo, $da)=explode('-',$day);
$t=mktime(4,0,0,$mo, $da, $yr)+24*60*60; // NB not all days are 24 hours
return date('Y-m-d',$t);
}
答案 2 :(得分:0)
使用PHP我会做这样的事情(假设db-results在$res
中,日期为Y-m-d
为关键字):
$year = date('Y');
for ($month = 1; $month <= 12; $month++) {
$last_day = date('t', mktime(0, 0, 0, 1, $month, $year));
for ($day = 1; $day <= $last_day; $day++) {
$key = sprintf('%4d-%02d-%02d', $year, $month, $day);
if (!empty($res[$key])) {
$output[$key] = $res[$key];
} else {
$output[$key] = 0;
}
}
}
这样你就会得到一个数组$output
,其空白日期的值为0
。