3
 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
   }

使这段代码现在动态现在我可以获取给定月份和年份的任何月份的所有日期现在我要做的是创建一个函数,该函数将遍历所有日期并将查询发送到数据库以查找数据,如果找到它将设置其他明智的价值为零是正确的方法吗?

4

4 回答 4

3

这将获得atn_date本月的所有记录:

SELECT * FROM `tbl_atn` WHERE `atn_date` BETWEEN "2012-06-01" AND "2012-06-30"

这个 PHP 将在本月的每一天循环:

$thisTime = strtotime("2012-06-01");
$endTime = strtotime("2012-06-31");
while($thisTime <= $endTime)
{
    $thisDate = date('Y-m-d', $thisTime);
    echo $thisDate;

    $thisTime = strtotime('+1 day', $thisTime); // increment for loop
}
于 2012-06-13T18:03:01.830 回答
2

当您的表可能没有或只有您感兴趣的范围内的一些记录时,显示连续序列的常用方法是使用整数表。整数表按顺序包含从 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);
于 2012-06-13T18:24:12.657 回答
1

如果您想获取一个月中的特定日期然后查询它们,您可以使用内置的 PHP 函数 cal_days_in_month ( http://php.net/manual/en/function.cal-days-in-month.php )。您可以编写一个真正简单的函数来处理此问题,例如:

function getDateTime($month, $year){
    $month = intval($month);
    $year = intval($year);
    $day = cal_days_in_month(CAL_GREGORIAN, $month, $year);

    //Now build your query here since you will have the days of the month
    $query = SELECT * FROM `tbl_atn` WHERE `atn_date` BETWEEN $year."-".$month."-1" AND $year."-".$month."-".$day;
}

请注意,日期片段是您在数据库中配置的。为简单起见,我只是使用了 Scott Saunders 的上述查询示例。

如果您没有为您的 PHP 堆栈构建的日历插件,您还可以使用 date() - http://php.net/manual/en/function.date.php执行自定义函数。

于 2012-06-13T18:30:36.770 回答
0

可以使用 mysql 检索特定月份和年份的日期列表

你可以试试这个:

           SELECT 
                ldays.`day` as 'Date',
                atn.`regular` as RegularHours,
                atn.`over` as OT1,
                atn.`over` as OT2,
                atn.`total_hrs` as TotalHrsPerDay,
                atn.`comments` as Comments
                FROM( 
                SELECT DATE_FORMAT(ADDDATE(LAST_DAY(SUBDATE(DATE_FORMAT('{$DateParamHere}','%Y-%m-%d'), INTERVAL 1 MONTH)), 1) + INTERVAL a + b DAY,'%Y-%m-%d') as 'day'
                FROM
                (SELECT 0 a UNION SELECT 1 a UNION SELECT 2 UNION SELECT 3
                    UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7
                    UNION SELECT 8 UNION SELECT 9 ) d,
                (SELECT 0 b UNION SELECT 10 UNION SELECT 20 
                    UNION SELECT 30 UNION SELECT 40) m
                WHERE ADDDATE(LAST_DAY(SUBDATE(DATE_FORMAT('{$DateParamHere}','%Y-%m-%d'), INTERVAL 1 MONTH)), 1) + INTERVAL a + b DAY  <=  LAST_DAY('{$DateParamHere}')
                ORDER BY a + b
                ) ldays
           LEFT JOIN `tbl_atn` atn ON (atn.`eng_id`='{$EngIDParamHere}' AND DATE(atn.`atn_date`) = ldays.`day`)

$DateParamHere = 您可以在此处设置特定的年、月和当前日期,并在 mysql 中以 '%Y-%m-%d' 的格式将其连接起来,但无论如何您都可以更改其格式

$EngIDParamHere = 将特定工程师的 id 放在这里

之后你就可以走了.. :)

于 2013-03-07T05:55:54.457 回答