sql >> Database >  >> RDS >> Mysql

Hoe bewaar je een lijst met weekdagen in MySQL?

Om dit probleem op te lossen, gebruik ik uiteindelijk een bitmasker om de weekdagen op te slaan.

Ik heb de inhoud van de array voor weekdagen gewijzigd in iets als dit:

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

Gebruik deze lijst als referentie:

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

Daarna heb ik een TINYINT . toegevoegd kolom om het bitmasker voor weekdagen vast te houden. Bij het opslaan van de waarden in de database kan ik eenvoudig het volgende gebruiken:

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

Om te zoeken naar rijen met een specifieke weekdag, bijvoorbeeld zaterdag, kan ik deze voorwaarde gebruiken:

... WHERE `weekdays` & 64;

De weekdagen ophalen uit de database omdat een array iets minder eenvoudig is. Ik gebruik de volgende logica:

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

Als ik alle rijen met dezelfde weekdag als de huidige datum moet ophalen, kan ik de huidige weekdag als volgt doorgeven aan de vorige SQL-voorwaarde:

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

Dan:

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


  1. PHP/MySQL - hoe automatisch een verwijderlink genereren voor een rij in een reeds automatisch gegenereerde tabel?

  2. Kan offset-naïeve en offset-bewuste datetimes niet aftrekken

  3. Laravel invoegen bij 3 gerelateerde tabellen

  4. Oracle naar PostgreSQL — Cursors en ltrees