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

时间:2015-09-16 19:54:18

标签: php mysql laravel

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

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

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

我知道我可以使用SET列,但由于与我正在使用的框架(Laravel)不兼容,我更倾向于不使用此类型。

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

2 个答案:

答案 0 :(得分:5)

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

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

$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};

答案 1 :(得分:0)

我使用mysql的WEEKDAY()函数,通过传递WEEKDAY(CURDATE())我得到了工作日编号。

  

注:0 =星期一,1 =星期二,2 =星期三,3 =星期四,4 =   星期五,5 =星期六,6 =星期日。

SELECT WEEKDAY("2019-01-28");

这将返回0

我在表字段中将数据存储为逗号分隔,并使用IN子句找到了它

  

table_data

q_id | weekdays
 1   |   0,1   
 2   |   0,1,2
 3   |   0,2,4
 4   |   1,2,3,4   
  

下面是查询,该查询将返回包含当前工作日编号的记录。

 SELECT `q_id` FROM table_data WHERE WEEKDAY(CURDATE()) IN (weekdays);
  

修改

正如Gustavo在评论中所指出的那样,以上内容在mysql 5.7中不起作用。DAYOFWEEK()可以工作,但是周数与上面的示例不同,您可以找到文档here