カスタム 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 には多くの変数を置き換える必要があるため、もっと良い方法があるのではないでしょうか?