在一系列日期之间进行选择,控制那些日期的年龄

时间:2012-07-13 15:56:11

标签: sql

我正在尝试搜索结构类似的记录

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.有更有效的方法吗?

编辑:忘记了第二个日期和其他一些格式化内容

1 个答案:

答案 0 :(得分:1)

根据您拥有的信息,您需要计算当前年龄。我们的想法是将交易后的年数添加到年龄。我对Oracle datetime函数不太满意,但以下内容应该有效:

select tl.*, 
from trans_logs tl
where customer_age + (SYSDATE- trans_Date)/365 = 20

请注意这是一个近似值,因为根据他们的出生日期和交易日期之间的重新关系,你会得到大约“20”的人。

如果可以的话,最好带上生日。我明白,向人们询问他们的年龄可能比向人们询问他们的出生日期更容易,所以你可能没有选择。