CREATE TABLE `tbl_atn` (
`atn_id` int(15) NOT NULL AUTO_INCREMENT,
`eng_id` int(15) DEFAULT NULL,
`visit` varchar(50) DEFAULT NULL,
`travel` varchar(50) DEFAULT NULL,
`start_time` varchar(50) DEFAULT NULL,
`mile` varchar(50) DEFAULT NULL,
`end_time` varchar(50) DEFAULT NULL,
`comments` varchar(100) DEFAULT NULL,
`actual` varchar(50) DEFAULT NULL,
`total_job` varchar(50) DEFAULT NULL,
`regular` varchar(50) DEFAULT NULL,
`over` varchar(50) DEFAULT NULL,
`total_hrs` varchar(50) DEFAULT NULL,
`pay` varchar(50) DEFAULT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`atn_date` date DEFAULT NULL,
PRIMARY KEY (`atn_id`)
)
我想要做的是创建每个月的月度报告.如果没有记录为空,则显示所有特定日期并从上表中记录
以上是我的表.我正在尝试创建此应用程序,但由于此表,我被卡住了.首先,这只能通过MySQL查询来实现吗?如果没有,我要做的就是首先生成所有日期,然后对于每个日期我必须从数据库中获取记录然后运行另一个查询来总结它们.我无法为此创建查询.
有帮助吗?
$Now = date('Y-m-d');
$month = date("m",strtotime($Now));
$year = date("Y",strtotime($Now));
$first = date('Y-m-d', mktime(0, 0, 0, $month, 1, $year));
$last = date('Y-m-t', mktime(0, 0, 0, $month, 1, $year));
$thisTime = strtotime($first);
$endTime = strtotime($last);
while($thisTime <= $endTime)
{
$thisDate = date('Y-m-d', $thisTime);
echo $thisDate."<br>";
$thisTime = strtotime('+1 day', $thisTime); // increment for loop
}
现在这个代码变得动态了我现在可以获得给定月份和年份的任何月份的所有日期现在我将要做的是创建一个函数,它将遍历所有日期并将查询发送到数据库以查找数据,如果发现它将设置价值其他明智的零是正确的方法吗?
解决方法:
当您的表可能没有或只有您感兴趣的范围内的某些记录时,显示连续序列的常用方法是使用整数表.整数表按顺序包含0到9的整数.当您需要一组连续数字时,您可以自己加入它以获得您想要的数字.所以对于5到25的范围
SELECT i.n + j.n*10 as num
FROM myints i CROSS JOIN myints j
WHERE (i.n + j.n*10) BETWEEN 5 AND 25
ORDER BY (i.n + j.n*10);
在您的情况下,您想要连续日期.您知道任何特定月份最多可以有31天,因此您可以为0到31之间的一组整数执行子查询,并将其表示为从月初开始到月末结束的日期.像这样:
SELECT DATE_ADD('2012-06-01', INTERVAL n.num DAY) AS mydate, o.*
FROM
(SELECT i.n + j.n*10 as num
FROM myints i CROSS JOIN myints j
WHERE (i.n + j.n*10) BETWEEN 0 AND 31
ORDER BY (i.n + j.n*10)) AS n
LEFT JOIN other o ON ( DATE_ADD('2012-06-01', INTERVAL n.num DAY) = o.atn_date)
WHERE mydate BETWEEN '2012-06-01 '2012-06-30';
要么
SELECT datelist.mydate, o.* FROM
(SELECT DATE_ADD( '2012-01-06', INTERVAL i.n + j.n*10 DAY) as mydate
FROM myints i CROSS JOIN myints j
WHERE mydate BETWEEN '2012-01-06' AND '2012-01-30'
ORDER BY (i.n + j.n*10)) datelist
LEFT JOIN othertable o ON (datelist.mydate=o.atn_date);