Mysql
 sql >> Database >  >> RDS >> Mysql

Come memorizzare un elenco di giorni feriali in MySQL?

Per risolvere questo problema, finisco per usare una maschera di bit per memorizzare i giorni feriali.

Ho cambiato il contenuto dell'array dei giorni feriali in qualcosa del genere:

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

Utilizzando questo elenco come riferimento:

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

Poi ho aggiunto un TINYINT colonna per contenere la maschera di bit dei giorni feriali. Quando si memorizzano i valori nel database, posso semplicemente utilizzare quanto segue:

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

Per cercare righe con un giorno della settimana specifico, ad esempio sabato, posso utilizzare questa condizione:

... WHERE `weekdays` & 64;

Recuperare i giorni della settimana dal database poiché un array è un po' meno semplice. Sto usando la seguente logica:

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

Se devo recuperare tutte le righe con lo stesso giorno della settimana della data corrente, posso passare il giorno della settimana corrente alla condizione SQL precedente come segue:

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

Quindi:

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