Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara menyimpan daftar hari kerja di MySQL?

Untuk mengatasi masalah ini, saya akhirnya menggunakan bitmask untuk menyimpan hari kerja.

Saya mengubah isi array hari kerja menjadi seperti ini:

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

Menggunakan daftar ini sebagai referensi:

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

Kemudian saya menambahkan TINYINT kolom untuk menampung bitmask hari kerja. Saat menyimpan nilai dalam database, saya cukup menggunakan yang berikut ini:

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

Untuk mencari baris dengan hari kerja tertentu, Sabtu misalnya, saya dapat menggunakan ketentuan ini:

... WHERE `weekdays` & 64;

Mengambil hari kerja dari database sebagai array sedikit kurang sederhana. Saya menggunakan logika berikut:

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

Jika saya perlu mengambil semua baris dengan hari kerja yang sama dengan tanggal saat ini, saya dapat meneruskan hari kerja saat ini ke kondisi SQL sebelumnya sebagai berikut:

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

Kemudian:

... 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. Mensimulasikan MySql OLD_PASSWORD di .NET atau MS SQL?

  2. MySQL - peringkat berdasarkan count() dan GROUP BY

  3. Mengapa kueri yang sama persis menghasilkan 2 hasil penjelasan MySQL yang berbeda?

  4. Akses MySQL ditolak 1045 kesalahan

  5. Mengapa menambahkan '*' ke kueri MySQL menyebabkan kesalahan sintaks?