Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment stocker une liste des jours de la semaine dans MySQL ?

Pour résoudre ce problème, je finis par utiliser un masque de bits pour stocker les jours de la semaine.

J'ai changé le contenu du tableau des jours de la semaine en quelque chose comme ceci :

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

En utilisant cette liste comme référence :

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

Ensuite, j'ai ajouté un TINYINT colonne pour contenir le masque de bits des jours de la semaine. Lors du stockage des valeurs dans la base de données, je peux simplement utiliser ce qui suit :

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

Pour rechercher des lignes avec un jour de semaine spécifique, samedi par exemple, je peux utiliser cette condition :

... WHERE `weekdays` & 64;

Récupérer les jours de la semaine à partir de la base de données sous forme de tableau est un peu moins simple. J'utilise la logique suivante :

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

Si j'ai besoin de récupérer toutes les lignes avec le même jour de la semaine que la date actuelle, je peux passer le jour de la semaine actuel à la condition SQL précédente comme suit :

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

Ensuite :

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