我正在使用mysql,我要求我的报告在一个月和一个月内获得每天的注册数据(如果按月搜索)(如果基于一年搜索)。
以下是我用来获取结果的查询
查询:
SELECT
COUNT(tenant_id) AS registered,
DATE_FORMAT(created_date,'%d') AS weeks
FROM asign_user
WHERE DATE_FORMAT(created_date,'%m')='02'
AND DATE_FORMAT(created_date,'%Y') = '2014'
GROUP BY DATE_FORMAT(created_date,'%d');
------------------------------- Day | Registered ------------------------------- 11 5 12 6 13 1 14 8 16 9 25 15
预期结果应为
------------------------------- Day | Registered ------------------------------- 01 0 02 0 03 0 04 0 05 0 06 0 . . . . . . . . 11 5 12 6 13 1 14 8 15 0 16 9 . . . . 25 15 . . . . 30/31 0
答案 0 :(得分:0)
我曾经创建了一个名为" all_days"的额外表格,其中包含给定时期内的所有日子(5年)。你可以使用那个与外连接,然后创建你想要的输出。我还建议你不要使用这种方法并在应用程序级别上执行此操作(这就是Strawberry所说的)。 我在报告引擎中使用了这种方法,它不允许任何应用程序级编码,所以这对我有用....但结果很慢:(
答案 1 :(得分:0)
就个人而言,我会稍微移动查询以将weeks
放在首位,以便您可以使用array_shift
。
注意:我在基本的MySQL中编写它,因为你没有说明你是否使用mysql_或mysqli_作为连接层
$sql = <<<SQL
SELECT
DATE_FORMAT(created_date,'%d') AS weeks
COUNT(tenant_id) AS registered,
FROM asign_user
WHERE DATE_FORMAT(created_date,'%m')='02'
AND DATE_FORMAT(created_date,'%Y') = '2014'
GROUP BY DATE_FORMAT(created_date,'%d');
SQL;
$run = mysql_query($sql);
if (mysql_num_rows($run) > 0)
{
// Create data
// This will give the days their registration count.
$days = array();
while ($day = mysql_fetch_assoc($run))
{
$days[array_shift($day)] = $day['registered'];
}
// Calculate days in the month
$month = cal_days_in_month(CAL_GREGORIAN, 2, 2014);
// Then loop them and print results
for ($i = 1; $i <= $month; $i++)
{
if (isset($days[$i])) {
echo "$i : " . $days[$i] . "<br />";
}
else {
echo "$i : 0<br />";
}
}
}
上面显示的是一个月内的日子 - 每月编辑都不会太难:)
答案 2 :(得分:0)
请看这个博客, http://www.media-division.com/using-mysql-generate-daily-sales-reports-filled-gaps/
我们的想法是创建一个日历表。
你也可以使用cron job和这个sql来填充新的约会日期
INSERT INTO calendar
(datefield
)VALUES(CURDATE())