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

週末のない日付でのスローバック

    DayName() 日付に対応する曜日の名前を取得する関数。この関数の結果を利用して、週末をNOT IN ('Saturday', 'Sunday')で制限します。 。

    また、数値ジェネレータの範囲を最大10に増やす必要があります。 。平日の5日間の両側で2つの週末(合計4日間)に遭遇する可能性があるためです。

    したがって、2(週末の最初のペア)+ 5(平日)+ 2(週末の2番目のペア)+ 1(6番目の平日)=10の日付を考慮する必要があります。このエッジケースの例は、入力日が日曜日の場合です。

    LIMIT 6を使用する必要があります エッジのない場合は、結果を6日までに制限します。

    スキーマ(MySQL v5.7)

    CREATE TABLE `HELPER_SEQ` (`I` tinyint(3) UNSIGNED NOT NULL);
    INSERT INTO `HELPER_SEQ` (`I`) VALUES 
    (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
    

    クエリ

    SELECT
        DATE_FORMAT((DATE('2018-11-21') - INTERVAL(S.`I` - 1) DAY), '%Y-%m-%d')
        AS VAR
    FROM `HELPER_SEQ` AS S 
    WHERE S.`I` <= 10 
      AND DAYNAME(DATE_FORMAT((DATE('2018-11-21') - INTERVAL(S.`I` - 1) DAY), '%Y-%m-%d')) NOT IN ('SATURDAY', 'SUNDAY')
    ORDER BY VAR DESC
    LIMIT 6;
    

    結果

    | VAR        |
    | ---------- |
    | 2018-11-21 |
    | 2018-11-20 |
    | 2018-11-19 |
    | 2018-11-16 |
    | 2018-11-15 |
    | 2018-11-14 |
    

    DBフィドルで表示

    エッジケースデモ-入力日:2018年11月25日(日曜日)

    CREATE TABLE `HELPER_SEQ` (`I` tinyint(3) UNSIGNED NOT NULL);
    INSERT INTO `HELPER_SEQ` (`I`) VALUES 
    (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
    

    クエリ#2

    SELECT
        DATE_FORMAT((DATE('2018-11-25') - INTERVAL(S.`I` - 1) DAY), '%Y-%m-%d')
        AS VAR
    FROM `HELPER_SEQ` AS S 
    WHERE S.`I` <= 10 
      AND DAYNAME(DATE_FORMAT((DATE('2018-11-25') - INTERVAL(S.`I` - 1) DAY), '%Y-%m-%d')) NOT IN ('SATURDAY', 'SUNDAY')
    ORDER BY VAR DESC
    LIMIT 6;
    

    結果

    | VAR        |
    | ---------- |
    | 2018-11-23 |
    | 2018-11-22 |
    | 2018-11-21 |
    | 2018-11-20 |
    | 2018-11-19 |
    | 2018-11-16 |
    

    DBフィドルで表示




    1. MySQLiを使用してデータベースにデータを挿入する

    2. IRIWorkbenchでのインクリメンタルデータレプリケーション

    3. PHP内からの.sqlファイルのロード

    4. プリペアドステートメントを使用した可変パラメータ/結果のバインド