Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie speichere ich eine Liste von Wochentagen in MySQL?

Um dieses Problem zu lösen, verwende ich am Ende eine Bitmaske, um die Wochentage zu speichern.

Ich habe den Inhalt des Wochentags-Arrays so geändert:

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

Verwenden Sie diese Liste als Referenz:

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

Dann fügte ich ein TINYINT hinzu Spalte, um die Bitmaske der Wochentage aufzunehmen. Beim Speichern der Werte in der Datenbank kann ich einfach Folgendes verwenden:

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

Um nach Zeilen mit einem bestimmten Wochentag zu suchen, z. B. Samstag, kann ich diese Bedingung verwenden:

... WHERE `weekdays` & 64;

Das Abrufen der Wochentage aus der Datenbank als Array ist etwas weniger einfach. Ich verwende die folgende Logik:

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

Wenn ich alle Zeilen mit demselben Wochentag wie das aktuelle Datum abrufen muss, kann ich den aktuellen Wochentag wie folgt an die vorherige SQL-Bedingung übergeben:

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

Dann:

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