php - 使用 PHP 为 MySQL 表中两个日期之间的每周时间段的每个实例生成记录

标签 php mysql date

我正在尝试执行以下操作:

我有一个 MySQL 表,其中包含客户每周定期举行 session 的时间段(存储为 SQL 日期),例如星期一 13:00、星期一 14:00、星期二 15:00 等。每个时间段都是唯一的,每个时间段只有一个条目(即该表包含“样本”周的数据)。

我想使用 PHP 生成两个指定日期之间的所有每周时段的列表,按时段排序。

例如,如果表中只有上述三个时间段,并且我想要 2013 年 1 月 1 日至 2013 年 1 月 15 日之间的所有时间段,则脚本将返回:

1 Jan 2013 15.00
7 Jan 2013 13.00
7 Jan 2013 14.00
8 Jan 2013 15.00
14 Jan 2013 13.00
14 Jan 2013 14.00
15 Jan 2013 15.00

我可以添加我当前拥有的代码,但我感觉这真的没有帮助,因为我对此陷入了相当的困惑!

最佳答案

编辑:忘记我的第一个答案,我误解了你的问题。我没有意识到您想要在时段表中创建每周重复的记录。

所以这是一个非常不同的解决方案。虽然只是部分内容,但可能对你有一点帮助。你的问题是你想要排序的输出。如果您在外部循环中循环遍历表中的行,然后在内部循环中循环遍历日期范围,则最终会得到错误的排序顺序。

为了避免这种情况,我们可以切换循环:在外循环中循环日期范围,在内循环中循环时间段。但问题是,您应该避免从 mysql 数据库重复请求相同的数据,这会不必要地减慢速度。

解决方案是从数据库中提取一次时隙,并将其存储在数组中。然后使用日期范围作为外循环。另一种解决方案是在外循环中循环数据库表中的行,但不立即回显结果,而是将它们添加到数组中,然后对数组进行排序。如果您存储 UNIX 日期(而不是格式化日期),那么排序就很容易。

无论如何,这是使用第一种方法的可能解决方案。唯一剩下的事情就是从您的时间段表创建 $timeslots array-of-associative-arrays。

# $timeslots is an array of associative arrays.
# The trick is to extract this data from your mysql table

$timeslots = array( 
    # Timeslot corresponding to Monday 15:00
    array ( 'dow' => 1, 'hour' => 15 ),
    # Tuesday 13:00
    array ( 'dow' => 2, 'hour' => 13 ),
);

$date = 1356998400; // '2013-01-01';
$end_date = 1358208000; // '2013-01-15';

while($date <= $end_date)
{
    # Convert the loop variable to day of week              
    $date_dow = date('w', $date); 

    foreach ($timeslots as $timeslot)
    {
        # Check if it matches the one in the timeslot
        if ($date_dow == $timeslot['dow'])
        {
            $timeofday = $date + (3600 * $timeslot['hour']);
            echo date("D, j M Y H:i", $timeofday) . '<br>';
        }

    }
    $date += 86400; # advance one day
}

上面的代码产生以下输出:

Tue, 1 Jan 2013 13:00
Mon, 7 Jan 2013 15:00
Tue, 8 Jan 2013 13:00
Mon, 14 Jan 2013 15:00
Tue, 15 Jan 2013 13:00

关于php - 使用 PHP 为 MySQL 表中两个日期之间的每周时间段的每个实例生成记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14901012/

相关文章:

php - 使用原则 2 确定缓存命中/未命中

javascript - 处理 iOS 虚拟键盘 “previous” , “next” , “Go/Enter” 按钮

mysql - 如何限制 LEFT JOIN 的结果

java - 在结果集开始之前

MySQL 监控变化

mysql - STR_TO_DATE 返回两位数年份的 future 日期

php - 通过查询在 PHP 中删除 Access 数据库

php:将毫秒转换为日期

sql - 获取当前月份?

javascript - AngularJS - 无法在 View 中显示日期对象