php - 如何在 MySQL 中存储工作日列表?

标签 php mysql laravel

我正在使用 PHP 编写一个应用程序,我需要在 MySQL 中存储一个唯一的工作日列表。

在应用程序中,我有一个数组来存储工作日,如下所示:

$days = [
    'Wed',
    'Thu',
    'Sat',
];

我知道我可以使用 SET 列,但我不想使用这种类型,因为它与我使用的框架 (Laravel) 不兼容。

如何使用我仍然可以在存储值中搜索的格式保存此列表?例如,我想检索所有包含星期日的行。

最佳答案

为了解决这个问题,我最终使用位掩码来存储工作日。

我将工作日数组内容更改为如下内容:

$days = [
     8, // Wednesday
    16, // Thursday
    64, // Saturday
];

使用此列表作为引用:

 1 : Sunday
 2 : Monday
 4 : Tuesday
 8 : Wednesday
16 : Thursday
32 : Friday
64 : Saturday

然后我添加了一个 TINYINT 列来保存工作日位掩码。在数据库中存储值时,我可以简单地使用以下内容:

$valueToMySQL = array_sum($days); // 88, with the sample above

要搜索具有特定工作日(例如星期六)的行,我可以使用以下条件:

... WHERE `weekdays` & 64;

从数据库中检索工作日作为数组有点不那么简单。我正在使用以下逻辑:

$days = [];
$bitmask = strrev(decbin($valueFromMySQL));
for ($i = 0, $s = strlen($bitmask); $i < $s; $i++) {
    if ($bitmask{$i}) {
        $days[] = pow(2, $i);
    }
}

如果我需要检索与当前日期具有相同工作日的所有行,我可以将当​​前工作日传递给前面的 SQL 条件,如下所示:

$weekday = (int) date('w'); // 0 for Sunday, to 6 for Saturday
$weekdayToMySQL = pow(2, $weekday); // 1 - 64

然后:

... WHERE `weekdays` & {$weekdayToMySQL};

关于php - 如何在 MySQL 中存储工作日列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32617522/

相关文章:

php - 对二维数组进行排序时保留数组键

javascript - margin 顶部 : Chrome & Safari

php - 在 Joomla 中显示动态文章列表

php - 在 Laravel 中添加操作 =""时表单失控

php - 查找在 PHP 中完成的更新数量

mysql - Angular Universal 中的异步 Node.js 请求。服务器渲染停止工作

mysql - 如何检查给定日期是否至少包括为用户列出的每个文档组?

php - Laravel 5 通配子域+路由模型绑定(bind)

mysql - 无法让 MYSQL 在 Laravel 中正确查询 JSON 列

php - 如何让drawtext过滤器在从右向左滚动时开始从中心滚动文本