sql >> データベース >  >> RDS >> Mysql

MySQLに平日のリストを保存する方法は?

    この問題を解決するために、私は最終的にビットマスクを使用して平日を保存します。

    平日の配列の内容を次のように変更しました:

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

    このリストを参照として使用する:

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

    次に、TINYINTを追加しました 平日のビットマスクを保持する列。データベースに値を保存するとき、私は単に以下を使用することができます:

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

    特定の平日、たとえば土曜日の行を検索するには、次の条件を使用できます。

    ... WHERE `weekdays` & 64;
    

    配列としてデータベースから平日を取得するのは少し簡単ではありません。次のロジックを使用しています:

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

    現在の日付と同じ曜日のすべての行を取得する必要がある場合は、次のように現在の曜日を前のSQL条件に渡すことができます。

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

    次に:

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


    1. その行に関連するアイテムが別のテーブルに存在するかどうかのフラグを含む一時列を返すMySQLクエリを作成する方法

    2. MySQLの日付比較

    3. SQLServerモニタリングの総所有コストを計算する

    4. Postgres接続を取得するためにHibernateが遅い