2017-06-19 37 views
0

我想選擇一個日期範圍內的數據選擇一個日期範圍另一個日期範圍內在於如何從不同範圍的日期字段

我有以下表

ID FNAME LNAME BEG_EPISODE_DT END_EPISODE_DT TRGT_DT 
1 John G  12/20/16  02/11/17  03/31/17 
2 King R  11/10/16  12/25/17  03/31/17 
3 Bundt H  10/19/16  01/16/17  03/31/17 
4 Smith F  02/16/16  04/08/17  03/31/17 

以上數據顯示每個人的情節。情節是指從一個小插曲(BEG_EPISODE_DT)的開始時間,結束它(END_EPISODE_DT)

我需要選擇數據,使得3個月內的每個單獨的謊言(TRGT_DT)情節的目標日期之前,即情節(BEG_EPISODE_DT或END_EPISODE_DT)應該在03/31/17之間3個月之前它

我想要使用以下邏輯。但我不能讓它工作

select * from mytable 
BEG_EPISODE_DT between ((ADD_MONTHS(TRGT_DT,-3), TRGT_DT) or 
END_EPISODE_DT between ((ADD_MONTHS(TRGT_DT,-3), TRGT_DT) or 
BEG_EPISODE_DT = (ADD_MONTHS(TRGT_DT,-3) or TRGT_DT) or 
END_EPISODE_DT = (ADD_MONTHS(TRGT_DT,-3) or TRGT_DT) 

我找了如下結果

ID FNAME LNAME BEG_EPISODE_DT END_EPISODE_DT TRGT_DT 
1 John G  12/20/16  02/11/17  03/31/17 
3 Bundt H  10/19/16  01/16/17  03/31/17 
4 Smith F  02/16/16  04/08/17  03/31/17 

感謝您的幫助

編輯:BEG_EPISODE_DT或END_EPISODE_DT可以等於TRGT_DT或(TRGT_DT - 3個月)

+0

儘管Oracle確實購買了mysql,但在sw級別上它們仍然是不同的產品。 – Shadow

+0

我不明白解釋。如果包含TRGT_DT = 03/31/17的行,如果BEG_EPISODE_DT或END_EPISODE_DT(或者可能兩者)在2017年1月1日至2017年3月31日之間?請注意,01/01/2017不是2017年3月31日前的三個月(即2016年12月31日)。除此之外,目前還不清楚爲什麼你減去兩個月而不是三個月,然後從任何東西中減去0。也完全不清楚爲什麼你截至月初 - 在你的邏輯中完全沒有提到這一點。請澄清。 – mathguy

+0

請參閱mairguy的回答下Jair的問題...... Whi是Smith包含在「期望的輸出」中嗎?開始和結束日期都不在2016年12月31日至2017年3月31日之間。或者你的意思是不同的 - 你不希望特定的開始日期或結束日期在那個時間間隔內,而是,「情節」的任何部分至少有一天與該時間間隔相同? (如果是這樣,那麼爲什麼國王不包括在輸出中呢?) – mathguy

回答

0

您錯過了WHERE子句的關鍵字WHERE。除此之外,BETWEEN語法更爲簡單。例如:

where beg_episode_dt between add_months(trgt_dt, -3) and trgt_dt 
     or end_episode_dt between add_months(trgt_dt, -3) and trgt_dt 
+1

我也這樣想過,這個謂詞排除了Hemansh在他期望的結果中包含的「Smith」,所以要麼這不是解決方案他正在尋找,或者他錯誤地將史密斯列爲積極成果。我錯了嗎? –

+0

你說得對,我沒有明白。 '史密斯'違反了OP以簡單英語解釋的規則。我將添加爲評論。 – mathguy