select 
sum(case when 
   trunc(months_between(to_date(to_char(sysdate,'YYYYMMDD'),'YYYYMMDD'),to_date(date_in,'YYYYMMDD')))<=1
     then 1 
     else 0
     end
)  from pe_person
我想筛选date_in时间不满一年的所有记录!这样做不行。求解,谢谢!

解决方案 »

  1.   

    SELECT SUM(case when sysdate-date_in > trunc(sysdate,'yyyy')-trunc(add_months(sysdate,12),'yyyy') THEN 1 ELSE O END)
    FROM pe_person;
      

  2.   


    -- 没看清楚,你的 date_in 是字符串类型的,表示日期?
    -- 方式有二:
    -- 其一:
    SELECT SUM(case when sysdate-to_date(date_in,'YYYYMMDD') > trunc(sysdate,'yyyy')-trunc(add_months(sysdate,12),'yyyy') THEN 1 ELSE O END)
    FROM pe_person;-- 或者
    -- 其二:
    SELECT SUN(CASE WHEN month_between(sysdate,to_date(date_in,'YYYYMMDD')) <12 THEN 0 ELSE 1 END)
    FROM pe_person;-- 具体看你的一年是怎么定义啦?是指当前年的天数?还是根据 date_in的日期,超过12个月?
      

  3.   

    -- 没看清楚,你的 date_in 是字符串类型的,表示日期?
    -- 方式有二:
    -- 其一:
    SELECT SUM(case when sysdate-to_date(date_in,'YYYYMMDD') > trunc(sysdate,'yyyy')-trunc(add_months(sysdate,12),'yyyy') THEN 1 ELSE O END)
    FROM pe_person;-- 或者
    -- 其二:
    SELECT SUN(CASE WHEN months_between(sysdate,to_date(date_in,'YYYYMMDD')) <12 THEN 0 ELSE 1 END)
    FROM pe_person;-- 具体看你的一年是怎么定义啦?是指当前年的天数?还是根据 date_in的日期,超过12个月?
      

  4.   

    不好意思,寫錯了。是一個月的!而且date_in是格式為YYYYMMDD的字符串列!
      

  5.   

    -- 那就这样:
    SELECT SUN(CASE WHEN months_between(sysdate,to_date(date_in,'YYYYMMDD')) <1 THEN 0 ELSE 1 END)
    FROM pe_person;-- 你的应该是正确的!
      

  6.   


    -- 那就这样:
    SELECT SUM(CASE WHEN months_between(sysdate,to_date(date_in,'YYYYMMDD')) <1 THEN 0 ELSE 1 END)
    FROM pe_person;-- 你的应该是正确的!
      

  7.   

    但是汇总结果为0,实际查询是有结果的。而且months_between处理也是有结果的
      

  8.   


    -- 以上查询是汇总date_in字段,时间超过一个月的所有记录行(看有多少行记录的 date_in超过一个月)
    -- 以下查询是汇总date_in字段的时间没有超过一个月的所有记录行!
    SELECT SUM(CASE WHEN months_between(sysdate,to_date(date_in,'YYYYMMDD')) <1 THEN 1 ELSE 0 END)
    FROM pe_person;
      

  9.   


    -- 那就这样测试一下:
    SELECT  COUNT(*) AS ALL_Lines, -- 表中的所有记录
            SUN(CASE WHEN months_between(sysdate,to_date(date_in,'YYYYMMDD')) <1 THEN 0 ELSE 1 END) as Less_oneMonth, -- date_in少于一个月的所有记录行
            SUN(CASE WHEN months_between(sysdate,to_date(date_in,'YYYYMMDD')) <1 THEN 1 ELSE 0 END) as MoreThan_oneMonth, -- date_in大于等于一个月的所有记录行       
    FROM pe_person
    WHERE date_in is not null; -- 排除时间字段为空的记录行(前提:你的时间字段的所有记录行的格式正确(即:能转换成时间类型)-- 查看 less_oneMonth + MoreThan_oneMonth = all_lines ?
      

  10.   

    -- 悲哀,SUM又写错啦!-- 那就这样测试一下:
    SELECT  COUNT(*) AS ALL_Lines, -- 表中的所有记录
            SUM(CASE WHEN months_between(sysdate,to_date(date_in,'YYYYMMDD')) <1 THEN 0 ELSE 1 END) as Less_oneMonth, -- date_in少于一个月的所有记录行
            SUM(CASE WHEN months_between(sysdate,to_date(date_in,'YYYYMMDD')) <1 THEN 1 ELSE 0 END) as MoreThan_oneMonth, -- date_in大于等于一个月的所有记录行       
    FROM pe_person
    WHERE date_in is not null; -- 排除时间字段为空的记录行(前提:你的时间字段的所有记录行的格式正确(即:能转换成时间类型)-- 查看 less_oneMonth + MoreThan_oneMonth = all_lines ?
      

  11.   

    你是要查询少于一个月的记录总数还是什么汇总的你的就可以select  
    sum(case when  months_between(sysdate,to_date(date_in,'YYYYMMDD'))<=1 then 1  else 0 end) 
    from pe_person