Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak przechowywać listę dni tygodnia w MySQL?

Aby rozwiązać ten problem, używam maski bitowej do przechowywania dni tygodnia.

Zmieniłem zawartość tablicy dni tygodnia na coś takiego:

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

Używając tej listy jako odniesienia:

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

Następnie dodałem TINYINT kolumna do przechowywania maski bitowej dni tygodnia. Podczas przechowywania wartości w bazie danych mogę po prostu użyć następującego:

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

Aby wyszukać wiersze z określonym dniem tygodnia, na przykład sobotą, mogę użyć tego warunku:

... WHERE `weekdays` & 64;

Pobieranie dni tygodnia z bazy danych w postaci tablicy jest trochę mniej proste. Używam następującej logiki:

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

Jeśli muszę pobrać wszystkie wiersze z tym samym dniem tygodnia co bieżąca data, mogę przenieść bieżący dzień tygodnia do poprzedniego warunku SQL w następujący sposób:

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

Następnie:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Derby czy MySQL czy...?

  2. MONTHNAME() Przykłady – MySQL

  3. Laravel Schema Builder :Tworzenie kolumny binarnej(16)

  4. mysql_ping zawiesza się z Amazon RDS

  5. Wdrażanie komentarzy i polubień w bazie danych