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

MySQLを時間範囲で分割

    返されるすべての時間を含む行ソースが必要です。次に、JOIN操作を使用して、返される行を選択できます。

    このようなテーブルがある場合:

    CREATE TABLE cal (tm TIME NOT NULL PRIMARY KEY) ENGINE=InnoDB ;
    INSERT INTO cal (tm)  VALUES ('00:00:00'),('00:30:00');
    INSERT INTO cal (tm) SELECT ADDTIME(tm,'01:00:00') FROM cal;
    INSERT INTO cal (tm) SELECT ADDTIME(tm,'02:00:00') FROM cal;
    INSERT INTO cal (tm) SELECT ADDTIME(tm,'04:00:00') FROM cal;
    ... 
    

    次に、それをクエリで使用できます:

    SELECT v.id
         , c.tm
      FROM myview v
      JOIN cal c
        ON c.tm >= v.hour_from
       AND c.tm <= v.hour_to
     ORDER BY v.id, c.tm
    

    特定の形式の時間値が必要な場合は、DATE_FORMATを使用できます。 機能:

    SELECT v.id
         , DATE_FORMAT(c.tm,'%H:%i') AS hour_
    

    これは、ビューによって返される値がTIMEであることを前提としています。 データ・タイプ。そうでない場合は、変換する必要があります。 (または、標準形式の文字列を使用して同じ結果を得ることができます。)

    注:テーブルがあることは必須ではありません。インラインビューなど、任意の行ソースにすることができます。必要なのは十分な行だけです(この場合、00:00から23:30までの30分刻みを想定すると、48行になります)。

    真夜中の境界を「越える」時間範囲(22:00から02:00など)がある場合、サンプルクエリは行を返しません。調整する必要があります。

    次のようなもの:

     JOIN cal c
       ON ( t.hour_from <= t.hour_to 
          AND c.tm >= v.hour_from
          AND c.tm <= v.hour_to
          )
       OR ( t.hour_from > t.hour_to 
          AND (   c.tm <= v.hour_from
              OR  c.tm >= v.hour_to
              )
          )
    



    1. GROUPBYからMAXを取得する

    2. 間隔で動的な年と月を使用して、連続してゼロを表示するにはどうすればよいですか?

    3. null以外の値を持つ同じ行がない場合にのみ、null値を持つ行を出力します

    4. MySQL5.6は、サービスを開始しようとしているプロセスでスタックしました