0

入力: 2 つの日付(eg, oct 1, 2013 to oct 10, 2013)

出力: 開始日から終了日までの日付ごとに 1 行。

私のコードは次のようなものです:

SELECT LoginDatetime,
       LogoutDatetime
FROM attendance
WHERE LoginDatetime BETWEEN $FromDate AND $ToDate
  AND userid = $_SESSION['loginid']

出力:

Oct 1 2013 9 am & Oct 1 2013 6 pm
Oct 10 2013 9 am & Oct 10 2013 6 pm

つまり、これはその人が出席している日しか得られませんが、彼が不在のすべての日付も表示したいです

  1. 2013 年 10 月 1 日午前 9 時 & 2013 年 10 月 1 日午後 6 時
  2. 不在。
  3. 不在
  4. ...
  5. 2013 年 10 月 10 日午前 9 時 & 2013 年 10 月 10 日午後 6 時

誰かが解決策を提案できますか?

4

1 に答える 1

1

次のようなものが必要です。

$date0 = \DateTime::createFromFormat('M j, Y', 'Oct 1, 2013');
$date1 = \DateTime::createFromFormat('M j, Y', 'Oct 10, 2013');
$day   = new \DateInterval('P1D');
while ($date0 <= $date1) {
    echo $date0->format('M j, Y'), PHP_EOL;
    $date0->add($day);
}

出力:

Oct 1, 2013
Oct 2, 2013
Oct 3, 2013
Oct 4, 2013
Oct 5, 2013
Oct 6, 2013
Oct 7, 2013
Oct 8, 2013
Oct 9, 2013
Oct 10, 2013

while目的の動作を得るために、ループ内にさらにチェックを追加できます。

// These could come from the database
$dates    = ['Oct 4, 2013', 'Oct 7, 2013', 'Oct 8, 2013'];
$fromDate = 'Oct 1, 2013';
$toDate   = 'Oct 10, 2013';

// Solution
// Remove comments below in order to always show the start and end dates
//$dates[] = $fromDate;
//$dates[] = $toDate;
$date0 = \DateTime::createFromFormat('M j, Y', $fromDate);
$date1 = \DateTime::createFromFormat('M j, Y', $toDate);
$day   = new \DateInterval('P1D');
while ($date0 <= $date1) {
    $string = $date0->format('M j, Y');
    echo (in_array($string, $dates) ? $string : 'Absent'), PHP_EOL;
    $date0->add($day);
}

出力:

Absent
Absent
Absent
Oct 4, 2013
Absent
Absent
Oct 7, 2013
Oct 8, 2013
Absent
Absent

PHP < 5.3 の編集

基本的な例:

$date0 = new DateTime('Oct 1, 2013');
$date1 = new DateTime('Oct 10, 2013');
while ($date0 <= $date1) {
    echo $date0->format('M j, Y'), PHP_EOL;
    $date0->modify('+1 day');
}

高度な例:

// These could come from the database
$dates    = ['Oct 4, 2013', 'Oct 7, 2013', 'Oct 8, 2013'];
$fromDate = 'Oct 1, 2013';
$toDate   = 'Oct 10, 2013';

// Solution
// Remove comments below in order to always show the start and end dates
//$dates[] = $fromDate;
//$dates[] = $toDate;
$date0 = new DateTime($fromDate);
$date1 = new DateTime($toDate);
while ($date0 <= $date1) {
    $string = $date0->format('M j, Y');
    echo (in_array($string, $dates) ? $string : 'Absent'), PHP_EOL;
    $date0->modify('+1 day');
}
于 2013-10-16T13:10:16.180 に答える