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

标签: MySQL PHP laravel
发布时间: 2017/4/9 22:58:49
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

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

在应用程序中,我有一个数组来存储平日里,像这样︰

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

我知道我可以使用 SET 列,但我倾向于不使用这种类型应有符合我使用的框架 ( Laravel )。

如何保存此列表使用的格式,我仍然可以内存储的值进行搜索?若要检索所有的行,例如有一个星期天,!

解决方法 1:

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

我平日数组内容改成这样的事情︰

$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};
官方微信
官方QQ群
31647020