出生日期 BDATE
开户日期 ODATE
以客户开户日期和出生日期做比对,客户在开户当日的年龄小于16岁的作为统计这个SQL怎么写啊

解决方案 »

  1.   

    直接用开户日-生日   select 20120320-19960101 from dual 大于160000就行了
      

  2.   

    select count(*) from 表名 where ODATE-BDATE <16
      

  3.   


    select count (1) from tableName where months_between(ODATE,BDATE) < 16*12
      

  4.   

    select (to_date('开户日期','yyyymmddhh24miss') - to_date(出生日期 ,'yyyymmddhh24miss'))/365 from dual;
      

  5.   

    select count(1) from table
    where ODATE > (BDATE + 365 * 16)
      

  6.   

    select *
    from tbname
    where bdate-odate<365*16
      

  7.   

    测试数据:CREATE TABLE T162
    (
        ID NUMBER(4),
        BDate DATE,
        ODate DATE
    );
    --符合条件的记录
    INSERT INTO T162 VALUES(1, to_date('1980-01-30', 'YYYY-MM-DD'), to_date('1990-01-30', 'YYYY-MM-DD'));
    INSERT INTO T162 VALUES(1, to_date('1980-01-30', 'YYYY-MM-DD'), to_date('1991-01-30', 'YYYY-MM-DD'));
    --不符合条件的记录
    INSERT INTO T162 VALUES(1, to_date('1980-01-30', 'YYYY-MM-DD'), to_date('1997-01-30', 'YYYY-MM-DD'));
    INSERT INTO T162 VALUES(1, to_date('1980-01-30', 'YYYY-MM-DD'), to_date('1998-01-30', 'YYYY-MM-DD'));测试结果:
      

  8.   

    如果用365测试的话  有bug  还有一年366天的年份呢? 可能刚好就差这2天满16年 
      

  9.   

    生日:1996-03-24  开户日:2012-03-21--实际上还差3天  但是以上面的测试都可以通过超过16
    select (date'2012-03-21'-date'1996-03-24')/365 c_date from dual       c_date
    -----------------------
    1 16.0027397260274
    --直接算差数 小于160000 不能开户
    select 20120321-19960324 c_date from dual       c_date
    --------------------
    1 159997