我正在尝试搜索结构类似的记录
trans_Date, customer_age, etc
客户年龄是交易时的年龄。我需要做的是选择目前处于特定年龄的所有客户,他们在日期范围之间进行交易。
让我们说我只想要在2005年至2010年期间购买的现有20岁儿童
我想出了这个
select * from trans_logs
where trans_date between TO_DATE("07/13/2005:00:00","MM/DD/YYYY:HH24:MI" and TO_DATE("01/01/2010:00:00","MM/DD/YYYY:HH24:MI")
and customer_age between 13 and 18
我得到了一些正确的结果,但我也得到了那些在2005年18岁时交易的人(现在他们25岁)
and((customer_age=13 and trans_date BETWEEN TO_DATE('01-JAN-2005:00:00'.'DD-MON-YYYY:HH24:MI') and TO_DATE('31-DEC-2005:23:59','DD-MON-YYYY:HH24:MI'))
or (customer_age=14 and trans_date BETWEEN TO_DATE('01-JAN-2006:00:00'.'DD-MON-YYYY:HH24:MI') and TO_DATE('31-DEC-2006:23:59','DD-MON-YYYY:HH24:MI'))
or (customer_age=15 and trans_date BETWEEN TO_DATE('01-JAN-2007:00:00'.'DD-MON-YYYY:HH24:MI') and TO_DATE('31-DEC-2007:23:59','DD-MON-YYYY:HH24:MI'))
or (customer_age=16 and trans_date BETWEEN TO_DATE('01-JAN-2008:00:00'.'DD-MON-YYYY:HH24:MI') and TO_DATE('31-DEC-2008:23:59','DD-MON-YYYY:HH24:MI'))
or (customer_age=17 and trans_date BETWEEN TO_DATE('01-JAN-2009:00:00'.'DD-MON-YYYY:HH24:MI') and TO_DATE('31-DEC-2009:23:59','DD-MON-YYYY:HH24:MI'))
or (customer_age=18 and trans_date BETWEEN TO_DATE('01-JAN-2010:00:00'.'DD-MON-YYYY:HH24:MI') and TO_DATE('31-DEC-2010:23:59','DD-MON-YYYY:HH24:MI')) )
但是这会返回一个错误,说我错过了一个合适的人。 1.我错过了什么? 2.有更有效的方法吗?
编辑:忘记了第二个日期和其他一些格式化内容
答案 0 :(得分:1)
根据您拥有的信息,您需要计算当前年龄。我们的想法是将交易后的年数添加到年龄。我对Oracle datetime函数不太满意,但以下内容应该有效:
select tl.*,
from trans_logs tl
where customer_age + (SYSDATE- trans_Date)/365 = 20
请注意这是一个近似值,因为根据他们的出生日期和交易日期之间的重新关系,你会得到大约“20”的人。
如果可以的话,最好带上生日。我明白,向人们询问他们的年龄可能比向人们询问他们的出生日期更容易,所以你可能没有选择。