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

Gus*_*ube 6 php mysql laravel

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

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

$days = [
    'Wed',
    'Thu',
    'Sat',
];
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用一个SET列,但由于与我正在使用的框架(Laravel)不兼容,我更喜欢不使用此类型.

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

Gus*_*ube 6

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

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

$days = [
     8, // Wednesday
    16, // Thursday
    64, // Saturday
];
Run Code Online (Sandbox Code Playgroud)

使用此列表作为参考:

 1 : Sunday
 2 : Monday
 4 : Tuesday
 8 : Wednesday
16 : Thursday
32 : Friday
64 : Saturday
Run Code Online (Sandbox Code Playgroud)

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

$valueToMySQL = array_sum($days); // 88, with the sample above
Run Code Online (Sandbox Code Playgroud)

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

... WHERE `weekdays` & 64;
Run Code Online (Sandbox Code Playgroud)

从数据库中检索工作日,因为数组不那么简单.我使用以下逻辑:

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

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

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

然后:

... WHERE `weekdays` & {$weekdayToMySQL};
Run Code Online (Sandbox Code Playgroud)