0

输入: 两个日期(eg, oct 1, 2013 to oct 10, 2013)

输出: 从开始日期到结束日期的每个日期一行。

我的代码是这样的:

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 回答