3

次の表があります。

id | start_date  |  end_date  | client_id
1    2013-08-01    2013-08-09       1
2    2013-08-10    2013-08-10       1
3    2013-08-10    2013-08-17       1
4    2013-08-18    2013-08-18       1
5    2013-08-18    2013-08-18       1
6    2013-08-18    2013-08-31       1
7    2013-08-01    2013-08-09       2
8    2013-08-11    2013-08-11       2
9    2013-08-11    2013-08-17       2
10   2013-08-19    2013-08-20       2

私がやろうとしているのは、各クライアントの日数を繰り返さずに、各クライアントが存在した日数を数えることです。そのため、以前のデータから取得しようとしています:

client_id | total_days
    1           31
    2           18

したがって、クライアントの場合1、2013 年 8 月 1 日から 2013 年 8 月 31 日までの 31 日間、欠席なく「出席」したため 31 を取得し、クライアントの場合2は 18 日間出席したため 18 を取得します。

8/1 - 8/9 = 9 days 
8/11 - 8/17 = 7 days 
8/19 - 8/20 = 2 days

とにかくMySQLでこれを達成する方法はありますか?しばらく試してみましたが、その方法がわかりません。

これがフィドルです

4

2 に答える 2

3

重複する範囲が存在する場合は、日付のリストであるドライバー テーブルを作成し、次JOINを使用してそのテーブルを作成することをお勧めしBETWEENます。

SELECT a.Client_ID, COUNT(DISTINCT b.Date)
FROM YourTable a
JOIN Dates b
  ON b.Date BETWEEN a.start_date  AND a.end_date
GROUP BY a.Client_ID

デモ: SQL フィドル

カレンダー テーブル ロジックを見つける場所はたくさんありますが、その 1 つを次に示します。

範囲が重複しない場合は、 を使用できますSUM(DATEDIFF())

于 2013-09-11T17:30:51.250 に答える
1

重複する範囲がない場合。次のクエリを使用できます。

SELECT Client_id,
       Sum(DATEDIFF(End_date, Start_date)) AS `Present`
FROM TABLE
GROUP BY Client_id;

これにより、クライアントが存在した日数の概要が得られます。

于 2016-03-25T09:07:59.133 に答える