0

MySQL データベース テーブルには、次の期間 (季節) があります。

sstart,send,sname
2013-05-01,2013-05-31,'season1'
2013-06-01,2013-06-30,'season2'

特定の開始日と終了日に対して、この期間を季節ごとに分割し、期間の各部分の期間に関する情報を含む SQL クエリを作成したいと思います。

たとえば、次の期間 (qstart,qend) 2013-04-20,2013-06-10 の場合、このクエリは次を返す必要があります。

2013-04-20,2013-04-30,'',11           <-- this is important - I need it
2013-05-01,2013-05-31,'season1',31    <-- 31 days of my period is in season1
2013-06-01,2013-06-10,'season2',10    <-- 10 days of my period is in season2

次の SQL クエリがあります。

SELECT sid,sname,DATEDIFF(IF(send>@qend,@qend,send),IF(sstart<@qstart,@qstart,sstart))+1
               FROM seasons WHERE sstart<=@qend AND send>=@qstart

私の問題は、期間 (qstart,qend) がデータベースで最初のシーズンの前に開始するか、最後のシーズンの後に終了する場合です。このクエリは、必要なこれらのテールを返しません。

4

2 に答える 2

0

他の人にとっては、Sparkyの提案によると、ここに私のクエリがあります:

SELECT sid,sstart,send,sname,DATEDIFF(IF(send>@lDay,@lDay,send),IF(sstart<@fDay,@fDay,sstart))+1 AS duration
FROM
(
  SELECT 0 AS sid,'undefined' AS sname,'1980-01-01' AS sstart,SUBDATE(MIN(sstart),1) AS send FROM seasons
    UNION
  SELECT sid,sname,sstart,send FROM seasons
    UNION
  SELECT 0 AS sid,'undefined' AS sname,ADDDATE(MAX(send),1) AS sstart,'2021-12-31' AS send FROM seasons
) AS seasons
WHERE sstart<=@lDay AND send>=@fDay
ORDER BY sstart
于 2013-06-12T14:38:42.560 に答える