2

データベース構造:

activities: id, description, date, time, endDate, endTime, userId

アクティビティを取得したので、日付、時刻が必要です。endDate と endTime は必要ありません。

問題は、今日のすべてのアクティビティを取得したい場合、次のようになります。

SELECT A.*, U.*
FROM activities
JOIN users U
ON U.id = A.userId
WHERE DATE(A.date) = DATE(CURDATE())

つまり、今日のすべてのアクティビティを取得できますが、昨日開始されたアクティビティがあり、終了日が明日になる場合は、まだアクティビティを取得する必要がありますか?

次のクエリを取得するよりも、次の週末に発生するすべてのアクティビティが必要です。

SELECT A.*, U.*
FROM activities
JOIN users U
ON U.id = A.userId
WHERE UNIX_TIMESTAMP(A.DATE) BETWEEN strtotime('previous saturday') 
AND (strtotime('previous monday') - 1)

しかし、繰り返しますが、「日付」が金曜日で、火曜日に終了する場合、週末に行われているすべてのアクティビティを取得する場合、まだそのアクティビティを取得する必要があります。これを解決するにはどうすればよいですか?

すでに助けてくれてありがとう!:)

4

2 に答える 2

0

を持っているレコードがないと仮定するとdate > endDate、次のように機能するはずです。

SELECT 
  a.*,
  a.begin_date activityBeginDate,
  IF(a.end_date IS NULL, a.begin_date, a.end_date) activityEndDate
FROM activity a
WHERE
  begin_date <= '2011-01-07' AND (end_date IS NULL OR end_date >= '2011-01-06')
HAVING
  (activityBeginDate <= '2011-01-06' AND activityEndDate >= '2011-01-06')
  OR
  (activityBeginDate >= '2011-01-07')
ORDER BY activityBeginDate

簡単にするために、join with usersテーブルを削除しましたが、問題なく追加できます。このクエリは、2011年1月6日から2011年1月7日までの間に「アクティブ」なイベントを探していることを前提としています。

したがって、ここで行うことは、希望する終了日より前に開始した、または希望する開始日より後に終了するすべてのイベントをリストすることです。この場合、希望する終了日より前に終了するイベントを一覧表示します。それが問題である場合は、追加の条件でそれらをフィルタリングできます。

私はこのクエリをさらに改善しようとします、それは単純化できる過労をしているかもしれません。

于 2011-11-30T11:36:00.827 に答える
0
SELECT A.*, U.*
FROM activities
  JOIN users U
    ON U.id = A.userId
  CROSS JOIN                                  --- example: test dates
    ( SELECT CURDATE()    AS startDate        --- between today and 
           , CURDATE() + INTERVAL 3 DAY
                          AS endDate          --- 3 days from now
    ) AS Check
WHERE (   A.endDate IS NULL
      AND A.`date` BETWEEN Check.startDate
                       AND Check.EndDate
      )
   OR (   A.`date` <= Check.EndDate
      AND Check.StartDate <= A.endDate 
      )
于 2011-11-30T12:55:48.137 に答える