Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm thế nào để lưu trữ danh sách các ngày trong tuần trong MySQL?

Để giải quyết vấn đề này, tôi sử dụng bitmask để lưu trữ các ngày trong tuần.

Tôi đã thay đổi nội dung mảng các ngày trong tuần thành một thứ như thế này:

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

Sử dụng danh sách này làm tài liệu tham khảo:

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

Sau đó, tôi đã thêm một TINYINT để giữ mặt nạ bit các ngày trong tuần. Khi lưu trữ các giá trị trong cơ sở dữ liệu, tôi chỉ cần sử dụng như sau:

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

Để tìm kiếm các hàng có một ngày trong tuần cụ thể, chẳng hạn như Thứ Bảy, tôi có thể sử dụng điều kiện sau:

... WHERE `weekdays` & 64;

Lấy các ngày trong tuần từ cơ sở dữ liệu dưới dạng một mảng ít đơn giản hơn một chút. Tôi đang sử dụng logic sau:

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

Nếu tôi cần truy xuất tất cả các hàng có cùng ngày trong tuần với ngày hiện tại, tôi có thể chuyển ngày trong tuần hiện tại sang điều kiện SQL trước đó như sau:

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

Sau đó:

... 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. Sequelize Find thuộc Hiệp hội nhiều thành viên

  2. Giỏ hàng Thương mại Điện tử tốt nhất cho nhà phát triển Zend Framework

  3. ER_NOT_SUPPORTED_AUTH_MODE - Máy chủ MySQL

  4. Trình phân tích cú pháp SQL trong PHP?

  5. phân vị theo COUNT (DISTINCT) với WHERE tương quan chỉ hoạt động với một chế độ xem (hoặc không có DISTINCT)