1

カスタム PHP 関数を使用して、開始日と期間を含むテーブルに基づいて日付をブロックする1 か月のビジュアル カレンダーを作成しています。例:

カレンダーの例

…14日から4日間、27日から7日間、テーブルを封鎖する必要があるというデータによって生成されます。

クエリは次のようになります。

  SELECT GROUP_CONCAT(DATE_FORMAT(start_date,'%d'),':', event_duration) AS info
    FROM events
   WHERE YEAR(start_date = '2012'
     AND MONTH(start_date) = '07'
ORDER BY start_date

(グループ連結を安全に無視して、データを個々の行として返すことができますが、それは実際には問題ではありません)。

イベントが前月に開始された場合、月の初めに日付をブロックするクエリの変更を探していますが、その長さは次のようになります。

たとえば、上記の例では、27 日のイベントは実際にはデータベースで 7 日間続くようにスケジュールされているため、次のクエリを実行MONTH(start_date) = '08'すると、最初の 2 つの日付がブロックされたと言いたいのですが、現在はブロックされていません。これは、それをブロックする開始日が選択されている月にないためです。

行を取得するためのサブクエリまたは何かがあると確信していますが、それについては考えられません。テイカーはいますか?

編集

以下のSalmanからの回答は、私が行きたい方向性を示しており、前月からの持ち越しを月の「1日」として残りの日数とともに表示する方法としてこれを思いつきました。

SELECT IF(MONTH(start_date) < '08', '2012-08-01', start_date) AS starter, 
       IF(MONTH(start_date) < '08', duration - DATEDIFF('2012-08-01',start_date), duration) AS duration
FROM EVENTS
WHERE YEAR(start_date) = '2012'
AND (MONTH(start_date) = '08' OR MONTH(start_date + INTERVAL duration DAY) = '08')

明らかに、PHP には多くの変数を置き換える必要があるため、もっと良い方法があるのではないでしょうか?

4

2 に答える 2

3

元の回答:

問題の月が であるとすると、次の2012-07クエリが必要です。

  SELECT column1, column2, columnN
   FROM `events`
  WHERE `start_date` <= '2012-07-01' 
    AND `start_date` + INTERVAL `duration` DAY > '2012-07-01'
ORDER BY start_date

修正された回答:

どうやら、重複する (または競合する) 日付をチェックするクエリが必要です。日付の例は終了2012-07-01して2012-08-01おり、クエリは次のとおりです。

  SELECT *
    FROM events
   WHERE '2012-08-01' > start_date
     AND start_date + INTERVAL duration DAY > '2012-07-01'
ORDER BY start_date

開始日と間隔を制限するには、次のSELECT ... CASEステートメントを使用できます。

SELECT
CASE 
    WHEN start_date < '2012-07-01' THEN '2012-07-01' 
    ELSE start_date
END AS start_date_copy,
CASE 
    WHEN start_date < '2012-07-01' THEN duration - DATEDIFF('2012-07-01', start_date)
    ELSE duration 
END AS duration_copy,
FROM ...
于 2012-07-08T20:31:39.140 に答える
0

私が正しい方向に私を向け、それを解決することを可能にしてくれた他の貢献者のおかげで、私が探していた答え!

これは、PHPからの$yyyyと$mm(私の場合は関数呼び出し)に基づいており、グループ化するのではなく、個々の行を選択します。

SELECT start_date, duration
FROM reservations
WHERE YEAR(start_date) = '".$yyyy."'
AND  MONTH(start_date) = '".$mm."'

UNION

SELECT '".$yyyy."-".$mm."-01',
duration - DATEDIFF('".$yyyy."-".$mm."-01',start_date)
FROM reservations
WHERE YEAR(start_date) = '".$yyyy."'
AND MONTH(start_date) < '".$mm."'
AND MONTH(start_date + INTERVAL duration DAY) = '".$mm."'

ORDER BY start_date
于 2012-07-08T21:19:33.113 に答える