2017-03-22 115 views
0

我與老師有一個爭論,他說在oracle的日期格式欄中使用substring是不可接受的。因爲substr應該在字符串上使用而不是在日期上使用。你對此有何看法?Substr date date

的TAST是:

Lists those guest who were in one of our apartment at his/her birthday 

查詢是這樣的:

select * 
from ACCOMODATION.GUEST 
    JOIN ACCOMODATION.RESERVATION ON (USERNAME = GUEST_FK) 
where to_date(CONCAT(SUBSTR(ACCOMODATION.RESERVATION.ARRIVAL,0,2), substr(BDAY, 3, length(BDAY)))) 
     between ACCOMODATION.RESERVATION.ARRIVAL and ACCOMODATION.RESERVATION.LEAVE ; 

ACCOMODATION.RESERVATION.ARRIVALACCOMODATION.RESERVATION.LEAVEBDAY是日期

+0

什麼是你列的數據類型'ACCOMODATION.RESERVATION.ARRIVAL'和'ACCOMODATION.RESERVATION.LEAVE'? – FDavidov

+0

今天的提示:表別名。 (使查詢更容易編寫和閱讀。) – jarlh

+3

順便說一下,你的老師絕對完全100%正確! – FDavidov

回答

0

正如評論,嘗試TO_CHAR的日期。如果已經存儲爲char,那麼你已經有了更大的問題

select AG.*, AR.* 
from ACCOMODATION.GUEST AG 
INNER JOIN ACCOMODATION.RESERVATION AR 
    ON (USERNAME = GUEST_FK) 
where (to_char(AR.LEAVE, 'MMDD') > to_char(AR.ARRIVAL, 'MMDD') 
     and to_char(AG.BDAY, 'MMDD') 
      between to_char(AR.ARRIVAL, 'MMDD') 
        and to_char(AR.LEAVE, 'MMDD')) -- for those who did not stay over the new year 
or (to_char(AR.LEAVE, 'MMDD') < to_char(AR.ARRIVAL, 'MMDD') -- for those who stayed over new year 
    and (to_char(AG.BDAY, 'MMDD') >= to_char(AR.ARRIVAL, 'MMDD') 
     or to_char(AG.BDAY, 'MMDD') <= to_char(AR.LEAVE, 'MMDD'))) 
+0

是的,我首先教了類似的東西,但我覺得有一種更簡單的方法來解決它。但我錯了。 – Daniel