依据当前年月查询满60周岁人员
根据当前年月查询满60周岁人员
Csrq xb
1954-11-01 男
1954-12-01 男
1959-11-01 女
1959-12-01 女
表a中有四条记录,两个字段,分别代表出生日期和性别,
我想以当前年月为准查询至截至上月男满60周岁,女满55周岁的人员,
以现在的时间2014年12月为准,截至上月11月份,将查询出第一条和第三条记录,假如现在是2015年1月份,将查询出第二条和第四条记录
如何写查询语句呢
------解决思路----------------------
------解决思路----------------------
------解决思路----------------------
------解决思路----------------------
可以先计算出男60岁,女55岁的日期。避免每条数据调用函数
------解决思路----------------------
如果仅考虑年和月,不考虑日,则:
select * from tb
where datediff(mm,csrq,getdate())>=(case when xb='男' then 720 else 660 end)
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)