我正在使用 PHP 编写应用程序,我需要在 MySQL 中存储一个独特的工作日列表。
在应用程序中,我有一个存储工作日的数组,如下所示:
$days = [
'Wed',
'Thu',
'Sat',
];
我知道我可以使用SET
列,但由于与我正在使用的框架(Laravel)不兼容,我更倾向于不使用此类型。
如何使用我仍然可以在存储值中搜索的格式保存此列表?例如,我想检索所有具有星期日的行。
答案 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。