有一张员工信息表,表结构如下:
员工号(userid),员工名(username),入职日期(effectdate),离职日期(leavedate)
==========================================================================
现在需要完成一个查询,条件如下:
1、首先要离职月份<=1个月(包括没有离职数据的,也就是leavedate为null)的员工,然后再以下面两个条件筛选
2、入职日期>=4号,考评月份-入职月份>=4个月,符合条件者,显示
3、入职日期<4号:
case 1号:考评月份-入职月份>=3个月,符合条件者显示
case 2号:when 1号星期天,考评月月份-入职月月份>=3个月,符合条件者显示
          else 考评月月份-入职月月份>=4个月,符合条件者显示
case 3号:when 1号星期六,考评月月份-入职月月份>=3个月,符合条件者显示
          else 考评月月份-入职月月份>=4,符合条件者显示
==========================================================================
其中“考评月份”,是一个参数,先假设为“2007年07月”。

解决方案 »

  1.   

    --首先要离职月份<=1个月(包括没有离职数据的,也就是leavedate为null)
    何解?
    离职月份怎么来的?
      

  2.   

    写错了不好意思噢。
    应该是“考评月份-离职月份”
    离职月份,当然是从“leavedate”这个字段而来罗。
    非常感谢
      

  3.   

    select *
    from tablename 
    where (leavedate >=dateadd(mm,-1,getdate()) or leavedate is null)
    and(
    day(effectdate) >= 4 and datediff(mm,effectdate,考评月份) >= 4
    or day(effectdate) = 1 and datediff(mm,effectdate,考评月份) >= 3
    or day(effectdate) = 2 and datepart(dw,effectdate) = 1 and datediff(mm,effectdate,考评月份) >= 3
    or day(effectdate) = 2 and datepart(dw,effectdate) <>1 and datediff(mm,effectdate,考评月份) >= 4
    or day(effectdate) = 3 and datepart(dw,effectdate) = 2 and datediff(mm,effectdate,考评月份) >= 3
    or day(effectdate) = 3 and datepart(dw,effectdate) <>2 and datediff(mm,effectdate,考评月份) >= 4
    )
      

  4.   

    declare @考评月份 datetime
    set @考评月份='2007-7-1'select * from 员工信息表 a
    where (离职日期 is null or 离职日期<dateadd(month,-1,@考评月份))
    and (
    day(入职日期)>=4 and datediff(month,入职日期,@考评月份)>=4
    or day(入职日期)=1 and datediff(month,入职日期,@考评月份)>=3
    or day(入职日期) in (2,3) and datepart(weekday,入职日期)=2 and datediff(month,入职日期,@考评月份)>=3
    or day(入职日期) in (2,3) and datepart(weekday,入职日期)<>2 and datediff(month,入职日期,@考评月份)>=4
    )
      

  5.   

    mengmou()mengmou() :
    看看以下所法对不对?case 2号:when 1号星期天,考评月月份-入职月月份>=3个月,符合条件者显示
              else 考评月月份-入职月月份>=4个月,符合条件者显示入职日期2号,1号星期天,那2号星期1case 3号:when 1号星期六,考评月月份-入职月月份>=3个月,符合条件者显示
              else 考评月月份-入职月月份>=4,符合条件者显示入职日期3号,1号星期六,那3号也星期1所以2 3 可以合并
      

  6.   

    ......................
    Sorry,I see
      

  7.   

    嗯,可以合并select *
    from tablename 
    where (leavedate >=dateadd(mm,-1,getdate()) or leavedate is null)
    and(
    day(effectdate) >= 4 and datediff(mm,effectdate,考评月份) >= 4
    or day(effectdate) = 1 and datediff(mm,effectdate,考评月份) >= 3
    or day(effectdate) in (2,3) and datepart(dw,effectdate) = 1 and datediff(mm,effectdate,考评月份) >= 3
    or day(effectdate) in (2,3) and datepart(dw,effectdate) <>1 and datediff(mm,effectdate,考评月份) >= 4
    )
      

  8.   

    离职日期<dateadd(month,-1,@考评月份))
    ----------
    应该改为>=吧.还有楼主说的离职总时间是距离现在还是距离考评月份?
      

  9.   

    -----参照mengmou()mengmou()  改的 考评时间是2007-07-01号Select * from User_table Where (datediff(mm,effectdate,leavedate)<=1 or leavedate is null) 
    and(day(effectdate)>=4 and datediff(mm,effectdate,'2007-07-1')>=4 or day(effectdate) = 1 and datediff(mm,effectdate,'2007-07-1') >= 3
    or day(effectdate) = 2 and datepart(dw,effectdate) = 1 and datediff(mm,effectdate,'2007-07-1') >= 3
    or day(effectdate) = 2 and datepart(dw,effectdate) <>1 and datediff(mm,effectdate,'2007-07-1') >= 4
    or day(effectdate) = 3 and datepart(dw,effectdate) = 2 and datediff(mm,effectdate,'2007-07-1') >= 3
    or day(effectdate) = 3 and datepart(dw,effectdate) <>2 and datediff(mm,effectdate,'2007-07-1') >= 4
    )
      

  10.   

    --其中“考评月份”,是一个参数,先假设为“2007年07月”。
    declare @table table(userid varchar(10),username varchar(20),effectdate datetime,leavedate datetime)
    insert into @table 
    select '0001','张三','2007-01-01','2007-06-20'
    union all select '0002','李四','2007-04-01',null
    union all select '0003','王五','2007-03-01',null
    union all select '0004','赵六','2007-03-02',null
    union all select '0005','刘七','2007-04-02',null
    union all select '0006','李二','2007-04-03',null
    declare @cMonth datetime
    set @cMonth='2007-07-31'--将日期设为考评月份的最后一天select userid,username,effectdate,leavedate 
    from @table  
    where datediff(mm,isnull(leavedate,convert(datetime,'9999-12-31')),@cMonth)<=1 and
    ((datediff(mm,effectdate,@cMonth)>=4)or (day(effectdate)<4 and 
    datepart(dw,convert(datetime,year(effectdate)+'-'+month(effectdate)+'-01')) in(7,1)
    and datediff(mm,effectdate,@cMonth)>=4)or
    (day(effectdate)=1 and datediff(mm,effectdate,@cMonth)>=3))/*
    userid     username             effectdate              leavedate
    ---------- -------------------- ----------------------- -----------------------
    0001       张三                   2007-01-01 00:00:00.000 2007-06-20 00:00:00.000
    0002       李四                   2007-04-01 00:00:00.000 NULL
    0003       王五                   2007-03-01 00:00:00.000 NULL
    0004       赵六                   2007-03-02 00:00:00.000 NULL
    */
      

  11.   

    -- 上面的写错了,以这个为准
    declare @table table(userid varchar(10),username varchar(20),effectdate datetime,leavedate datetime)
    insert into @table 
    select '0001','张三','2007-01-01','2007-06-20'
    union all select '0002','李四','2007-04-01',null
    union all select '0003','王五','2007-03-01',null
    union all select '0004','赵六','2007-03-02',null
    union all select '0005','刘七','2007-04-02',null
    union all select '0006','李二','2007-04-03',null
    declare @cMonth datetime
    set @cMonth='2007-07-31'--将日期设为考评月份的最后一天select userid,username,effectdate,leavedate 
    from @table  
    where datediff(mm,isnull(leavedate,convert(datetime,'9999-12-31')),@cMonth)<=1 and
    ((datediff(mm,effectdate,@cMonth)>=4)or 
    (day(effectdate)<4 and 
    (datepart(dw,convert(datetime,cast(year(effectdate)as char(4))+'-'+right(100+month(effectdate),2)+'-01'))in(1,7))
    and datediff(mm,effectdate,@cMonth)>=3)or
    (day(effectdate)=1 and datediff(mm,effectdate,@cMonth)>=3))/*结果
    userid     username             effectdate              leavedate
    ---------- -------------------- ----------------------- -----------------------
    0001       张三                   2007-01-01 00:00:00.000 2007-06-20 00:00:00.000
    0002       李四                   2007-04-01 00:00:00.000 NULL
    0003       王五                   2007-03-01 00:00:00.000 NULL
    0004       赵六                   2007-03-02 00:00:00.000 NULL
    0005       刘七                   2007-04-02 00:00:00.000 NULL
    0006       李二                   2007-04-03 00:00:00.000 NULL
    */