2017-03-22 94 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