sql >> Databáze >  >> RDS >> Mysql

Jak uložit seznam pracovních dnů v MySQL?

Abych tento problém vyřešil, nakonec jsem použil bitovou masku k uložení pracovních dnů.

Změnil jsem obsah pole pracovních dnů na něco takového:

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

Použití tohoto seznamu jako reference:

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

Potom jsem přidal TINYINT sloupec pro bitovou masku dnů v týdnu. Při ukládání hodnot do databáze mohu jednoduše použít následující:

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

K vyhledání řádků s konkrétním dnem v týdnu, například sobotou, mohu použít tuto podmínku:

... WHERE `weekdays` & 64;

Načíst pracovní dny z databáze jako pole je o něco méně jednoduché. Používám následující logiku:

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

Pokud potřebuji načíst všechny řádky se stejným dnem v týdnu jako aktuální datum, mohu předat aktuální den v týdnu do předchozí podmínky SQL takto:

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

Potom:

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


  1. MySQL:Velmi pomalá aktualizace/vkládání/mazání dotazů visí na kroku ukončení dotazu

  2. Počítejte návštěvy do dneška, tohoto týdne, minulého měsíce a celkem [Dotaz MySQL]

  3. Optimalizujte dotaz mysql pro použití indexu na klauzuli Bitwise where

  4. INTERSECT v MySQL