2016-07-26 17 views
-1
SELECT 
    floor(
     datediff('2016-08-01','2016-07-01')/7) * 2 + (
     CASE WHEN 
     IF (weekday('2016-08-01') >= 5, 4,weekday('2016-08-01')) >= 
    IF (weekday('2016-07-02') >= 5, 4,weekday('2016-07-01')) 
    THEN 

      IF (weekday('2016-08-01') >= 5, 4,weekday('2016-08-01')) - 
      IF (weekday('2016-07-01') >= 5, 4,weekday('2016-07-01')) 
     ELSE 
      5 + 
      IF (weekday('2016-08-01') >= 5, 4,weekday('2016-08-01')) -  
      IF (weekday('2016-07-01') >= 5, 4, weekday('2016-07-01')) 
     END 
    ) weekdays; 

このコードを実行すると、常に9が返されます。私はどこで間違っているのか分かりません。土曜日と日曜日の間に与えられた日付の間に10を指定してください。mysqlの2つの日付間の土曜日と日曜日の合計数を計算する方法

+0

いくつかのサンプルの入力に基づいて予想される出力を追加してください。実行中のクエリを貼り付けるだけではありません。 – 1000111

+0

2016-08-01と2016-07-01のような2つの日付を指定すると、指定された日付の間に土曜日の日曜日が返されます。 –

+0

すべての日付のテーブルはありますか? – 1000111

答えて

1

あなたの開始日と終了日の間のすべての日付を持つテーブルがない場合は、作成するクエリを採用する必要があります指定した日付範囲の間のすべての日付(最初から最後まで)その後、日があるかどうかをチェックするMySQLWEEKDAY関数を使用SaturdayまたはSunday

SELECT 
dateTable.Day, 
DAYNAME(dateTable.Day) AS dayName 
FROM 
( SELECT ADDDATE('2016-07-01', INTERVAL @i:[email protected]+1 DAY) AS DAY 
    FROM (
     SELECT a.a 
     FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a 
     CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b 
     CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c 
    ) a 
    JOIN (SELECT @i := -1) r1 
    WHERE 
    @i < DATEDIFF('2016-08-01', '2016-07-01') 

) AS dateTable 
WHERE WEEKDAY(dateTable.Day) IN (5,6) 
ORDER BY dateTable.Day; 

WORKING DEMO

注: WEEKDAY日付(のための曜日インデックスを返す0 =月曜日、1 =火曜日、... 6 =日曜日)。

EDIT:あなたが必要な場合は

のみcount

SELECT 
COUNT(*) AS total 
FROM 
( SELECT ADDDATE('2016-07-01', INTERVAL @i:[email protected]+1 DAY) AS DAY 
    FROM (
     SELECT a.a 
     FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a 
     CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b 
     CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c 
    ) a 
    JOIN (SELECT @i := -1) r1 
    WHERE 
    @i < DATEDIFF('2016-08-01', '2016-07-01') 

) AS dateTable 
WHERE WEEKDAY(dateTable.Day) IN (5,6) 

Demo

+0

日数のみを表示する必要があります –

+0

編集セクションをご覧ください – 1000111

関連する問題