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

date_subから週末をどのように除外しますか?

    この質問は、営業日を差し引くことについてです。週末が土曜日から日曜日であると仮定すると、次のようにソリューションを記述できます。

    私たちはそれを知っています:

    • 1週間ごとに5営業日があります。
    • したがって、
      • num_of_weeks =floor(@num_working_days / 5)
      • delta_days =@num_working_days % 5

    したがって、最初の概算は次のようになります。

    SET @num_working_days = 4; -- pick any integer
    SET @num_days = 7 * FLOOR(@num_working_days / 5) - @num_working_days % 5;     
    SELECT DATE_SUB(NOW(), INTERVAL @num_days DAY)
    

    ただし、これは次のような場合には機能しません。

    通常、次の場合は失敗します。

    WEEKDAY(NOW()) - @num_working_days % 5 < 0
    

    これを説明するには、この条件が満たされるたびに、さらに2日を差し引く必要があります。

    • overlay_days =2 * (WEEKDAY(NOW()) - @num_working_days % 5 < 0)

    したがって、2番目の近似は次のようになります:

    SET @num_working_days = 4;
    SET @overflow_days = 2 * (WEEKDAY(NOW()) - @num_working_days % 5 < 0)
    SET @num_days = 7 * FLOOR(@num_working_days / 5) - @num_working_days % 5;
    
    SELECT DATE_SUB(NOW(), INTERVAL @num_days DAY)
    

    最後に

    これは、now()である限り機能します week-endにありません 日。その場合は、now()を置き換える必要があります 上記の式で前の週末の日付を使用:

    • weekend_correction =DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) % 5 DAY)

    これは恐ろしい見た目ですが完全に機能します:

    SET @num_working_days = 4;
    SET @weekend_correction = DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) % 5 DAY);
    SET @overflow_days = 2 * (WEEKDAY(@weekend_correction) - @num_working_days % 5 < 0);
    SET @num_days = 7 * FLOOR(@num_working_days / 5) - @num_working_days % 5;
    
    SELECT DATE_SUB(@weekend_correction, INTERVAL @num_days DAY); 
    

    現在、本番環境では、MySQLサーバー上にこのロジックをカプセル化する関数を作成することをお勧めします。この関数は、稼働日を差し引く必要があるときにいつでも呼び出すことができます。



    1. MySQLで数値を通貨としてフォーマットする方法

    2. mysql階層は自己結合し、すべてのサブカテゴリを取得します

    3. SQLiteでRandomBlob()がどのように機能するか

    4. 整合性制約違反:1048列'taggable_id'をnullにすることはできません