sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo almacenar una lista de días de la semana en MySQL?

Para resolver este problema, termino usando una máscara de bits para almacenar los días de la semana.

Cambié el contenido de la matriz de días de la semana a algo como esto:

$days = [
     8, // Wednesday
    16, // Thursday
    64, // Saturday
];

Usando esta lista como referencia:

 1 : Sunday
 2 : Monday
 4 : Tuesday
 8 : Wednesday
16 : Thursday
32 : Friday
64 : Saturday

Luego agregué un TINYINT columna para contener la máscara de bits de los días de la semana. Al almacenar los valores en la base de datos, simplemente puedo usar lo siguiente:

$valueToMySQL = array_sum($days); // 88, with the sample above

Para buscar filas con un día de la semana específico, sábado por ejemplo, puedo usar esta condición:

... WHERE `weekdays` & 64;

Recuperar los días de la semana de la base de datos como una matriz es un poco menos simple. Estoy usando la siguiente lógica:

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

Si necesito recuperar todas las filas con el mismo día de la semana que la fecha actual, puedo pasar el día de la semana actual a la condición SQL anterior de la siguiente manera:

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

Entonces:

... WHERE `weekdays` & {$weekdayToMySQL};