如何在一个月内获得所有日期

时间:2012-06-13 18:00:52

标签: php mysql

 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`)
 )

table

我想要做的是每个月创建月份报告。如果没有记录,则显示所有特定日期和上表中的记录

以上是我的表。我正在尝试创建此应用程序,但由于此表,我被卡住了。首先,这只能通过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 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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);

答案 2 :(得分: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执行自定义功能。

答案 3 :(得分: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

之后你很高兴去......:)