Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como armazenar uma lista de dias da semana no MySQL?


Para resolver esse problema, acabo usando uma máscara de bits para armazenar os dias da semana.

Eu mudei o conteúdo da matriz de dias da semana para algo assim:
$days = [
     8, // Wednesday
    16, // Thursday
    64, // Saturday
];

Usando esta lista como referência:
 1 : Sunday
 2 : Monday
 4 : Tuesday
 8 : Wednesday
16 : Thursday
32 : Friday
64 : Saturday

Então eu adicionei um TINYINT coluna para manter a máscara de bits dos dias da semana. Ao armazenar os valores no banco de dados, posso simplesmente usar o seguinte:
$valueToMySQL = array_sum($days); // 88, with the sample above

Para pesquisar linhas com um dia da semana específico, sábado por exemplo, posso usar esta condição:
... WHERE `weekdays` & 64;

Recuperar os dias da semana do banco de dados como uma matriz é um pouco menos simples. Estou usando a seguinte lógica:
$days = [];
$bitmask = strrev(decbin($valueFromMySQL));
for ($i = 0, $s = strlen($bitmask); $i < $s; $i++) {
    if ($bitmask{$i}) {
        $days[] = pow(2, $i);
    }
}

Se eu precisar recuperar todas as linhas com o mesmo dia da semana que a data atual, posso passar o dia da semana atual para a condição SQL anterior da seguinte forma:
$weekday = (int) date('w'); // 0 for Sunday, to 6 for Saturday
$weekdayToMySQL = pow(2, $weekday); // 1 - 64

Então:
... WHERE `weekdays` & {$weekdayToMySQL};