0

データベースに次のテーブルがあります

メンバーシップ

  • ComapanyId
  • IsMember
  • JoinedDate
  • 有効期限
  • RejoinDate
  • LeavingDate

次のクエリを使用して、2011-01-31のすべてのメンバーを返します。

select * from MEMBERSHIP 
where (JoinedDate < '2011-01-31' or RejoinDate  < '2011-01-31') and IsMember=1

私の問題は、それが私のマネージャーが持っている数字と一致しないことです。私は何か間違ったことをしていますか?

4

4 に答える 4

1

問題は、IsMemberが現在メンバーであるかどうかであり、2011-01-31のメンバーであるかどうかではないということです。したがって、あなたの質問は、「今日アクティブだったメンバーのうち、2011年1月31日より前に最後に再参加したメンバーはどれですか?」という質問に本当に答えています。

たとえば、2011-01-30に開始し、2011-02-01に終了する人は、クエリのメンバーとしてカウントされませんが、その日付のメンバーになります。

最も正確な答えは、トランザクションテーブルでメンバーシップを探すことです。ここで、テーブルに参加したり終了したりします。

それを除けば、おそらく次のことが十分に近づきます。

select *
from MEMBERSHIP
where '2011-01-31' between JoinedDate and LeaveDate
于 2012-05-25T14:58:07.313 に答える
1

2011-01-31より前にメンバーであったが、現在はメンバーではないユーザーを一覧表示するため、「IsMember = 1」ステートメントを削除する必要がありますか?また、31番目を含める場合は、「<=」を使用する必要があります。

また、RejoinDateのデフォルト値は何ですか?nullの場合、WHEREステートメントに影響を与える可能性があります...

于 2012-05-25T14:52:32.177 に答える
0

問題は、日付が暗黙的に2011-01-31( )の深夜'2011-01-31 00:00:00'として扱われるため、その日のアクティビティが含まれないことです。< '2011-02-01'代わりに、31日のすべてのアクティビティが含まれるように使用してみてください。

于 2012-05-25T14:48:02.350 に答える
0

次のようなものを使用できます。

JoinedDate <= CONVERT(Date, '2011-01-31')
于 2012-05-25T14:51:34.387 に答える