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 に答える