依据当前年月查询满60周岁人员

根据当前年月查询满60周岁人员
Csrq             xb
1954-11-01       男
1954-12-01       男
1959-11-01       女
1959-12-01       女
  表a中有四条记录,两个字段,分别代表出生日期和性别,
   我想以当前年月为准查询至截至上月男满60周岁,女满55周岁的人员,
以现在的时间2014年12月为准,截至上月11月份,将查询出第一条和第三条记录,假如现在是2015年1月份,将查询出第二条和第四条记录
如何写查询语句呢
------解决思路----------------------
WITH all_CTE 
AS
(
select 1 id, '1954-11-01' csrq, '男' xb
union all
select 2 id, '1954-12-01' csrq, '男' xb
union all
select 3 id, '1959-11-01' csrq, '女' xb
union all
select 4 id, '1959-12-01' csrq, '女' xb
)

select * from all_CTE where id in (
select id from 
(select id, DATEADD(YY, case when xb='男' then 60 else 55 end, csrq) csrq from all_CTE) aa
where substring(CONVERT(varchar, csrq, 111),1,7)=substring(CONVERT(varchar, dateadd(month,-1,GETDATE()), 111),1,7)
)

------解决思路----------------------
select * from tbl where csrq < dateadd(year , case when xb = '男' then -60 else -50 end , getdate())

------解决思路----------------------
DECLARE @查询日期 DATETIME
SET @查询日期='2014-12-01'
SELECT * FROM TB
WHERE (DATEDIFF(MONTH,csrq,@查询日期)/12.0=60 AND xb='男')
OR (DATEDIFF(MONTH,csrq,@查询日期)/12.0=55 AND xb='女')

------解决思路----------------------
可以先计算出男60岁,女55岁的日期。避免每条数据调用函数

DECLARE @DT DATETIME = GETDATE()

DECLARE @MaleRetireDate VARCHAR(10),
@FemaleRetureDate VARCHAR(10)
SELECT  @MaleRetireDate = CONVERT(VARCHAR(7),DATEADD(MM,-60*12-1,@DT),120)+'-01',
@FemaleRetureDate = CONVERT(VARCHAR(7),DATEADD(MM,-55*12-1,@DT),120)+'-01'

;WITH all_CTE 
AS
(
select 1 id, '1954-11-01' csrq, '男' xb
union all
select 2 id, '1954-12-01' csrq, '男' xb
union all
select 3 id, '1959-11-01' csrq, '女' xb
union all
select 4 id, '1959-12-01' csrq, '女' xb
)
SELECT * FROM all_CTE
WHERE (xb='男' AND csrq >= @MaleRetireDate AND csrq <  CONVERT(VARCHAR(10),DATEADD(mm,1,@MaleRetireDate),120))
   OR (xb='女' AND csrq >= @FemaleRetureDate AND csrq <  CONVERT(VARCHAR(10),DATEADD(mm,1,@FemaleRetureDate),120))

------解决思路----------------------
如果仅考虑年和月,不考虑日,则:
select * from tb
where datediff(mm,csrq,getdate())>=(case when xb='男' then 720 else 660 end)