檢索

2012-05-25 75 views
0

我有我的數據庫中下表檢索

會員

  • ComapanyId
  • IsMember
  • JoinedDate
  • ExpiryDate
  • RejoinDate
  • LeavingDate之間的一些日期範圍內使用數據

我使用下面的查詢到所有成員爲2011-01-31

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

我的問題是它不符合我經理的數字返回。難道我做錯了什麼?

+0

的你解釋'joineddate','expirydate','rejoindate'和'leavingdate'之間的關係。還有'ismember'是什麼意思? – MatBailie

+0

@Dems會員 – Joshua

+0

你太含糊。對於'ismember',這是否意味着他們今天是會員***,所以對於歷史日期來說這意味着沒有***?您需要對所有這些字段進行完整且準確的描述,以便我們能夠理解所有的用例。 – MatBailie

回答

1

問題是IsMember當前是否是成員,而不是他們是否是2011-01-31中的成員。所以,你的問題真的回答了這樣的問題:「今天活躍的成員加入或最後在2011-01-31之前加入?」

例如,在2011-01-30開始並在2011-02-01退出的人不會算作您的查詢中的成員,但會在該日期成爲會員。

最準確的答案是查看成員資格的交易表,在該表中您已加入並退出。

除非,如下所示的可能得到足夠接近:

select * 
from MEMBERSHIP 
where '2011-01-31' between JoinedDate and LeaveDate 
0

問題是您的日期被隱式視爲午夜 2011-01-31('2011-01-31 00:00:00'),所以當天的任何活動都不包括在內。請嘗試使用< '2011-02-01'代替,以便包含31號上的所有活動。

+0

這只是一個問題。我認爲'IsMember'是一個緩存值,因爲他們是否是今天的會員 - 所以過濾日期是一個問題。只是在特定日期之前加入並不表明他們是否在該日期之前離開。不知道所有的領域意味着什麼,可能會有更多... – MatBailie

+0

而原來的查詢是使用「<」不是「<=」,所以這似乎是什麼意圖。 –

0

您clould使用這樣的事情:

JoinedDate <= CONVERT(Date, '2011-01-31') 
+0

OP沒有遇到語法錯誤,只是不同的結果。這根本沒有幫助。 – MatBailie

1

你不應該刪除「IsMember = 1」的語句,只要你想列出了之前2011-01-31成員的用戶,但不是會員了?也許你應該使用'< =',如果你想包括第31。

什麼是RejoinDate的默認值?如果它爲空它可能會影響您的WHERE語句...