数据库: twt001
数据表: tiqu60
我想查询出以现在的当前月为准,截至上月份,男满60周岁,女满55周岁以的人
比如第1条记录,身份证中的出生年月为195411,以现在的时间2014年12月为准,截至上月正好60周岁,则满足查询条件,而第二条记录不是我们想要的,则只在有下月的时候才能查询出来。同样满足55周岁的女性还有第四条记录),如何写查询查出第一条和第三条这样的记录呢?
以下是查询语句:
use twt001
select * from tiqu60
SELECT * FROM tiqu60
WHERE (SUBSTRING(sfzhm,7,6)=substring((CONVERT(VARCHAR(10),DATEADD(yy,-60,GETDATE()),112)),1,6) AND xb='男') OR
(SUBSTRING(sfzhm,7,6)=substring((CONVERT(VARCHAR(10),DATEADD(yy,-55,GETDATE()),112)),1,6) AND xb='女')
运行结果如下:
上面的查询是以年为增减单位的,也可以改以月为单位的查询,则要更改DATEADD函数:
DATEADD(mm,-720,GETDATE()),112),720个月正好是60年
上面的查询稍有不完美的地方:查询是到当月满60周岁,如果要查询截至上月满60周岁则要再减一个月,修改如下:DATEADD(mm,-721,GETDATE()),112)
完整的语句如下:
use twt001
select * from tiqu60
SELECT * FROM tiqu60
WHERE (SUBSTRING(sfzhm,7,6)=substring((CONVERT(VARCHAR(10),DATEADD(mm,-721,GETDATE()),112)),1,6) AND xb='男') OR
(SUBSTRING(sfzhm,7,6)=substring((CONVERT(VARCHAR(10),DATEADD(mm,-661,GETDATE()),112)),1,6) AND xb='女')
我们可以看出至截至2014年11月份,男满60周岁,女满55周岁的人查询了出来
语句分析:
substring((CONVERT(VARCHAR(10),DATEADD(yy,-60,GETDATE()),112)),1,6)
DATEADD(yy,-60,GETDATE()),将当年日期减去60年
CONVERT(VARCHAR(10),DATEADD(mm,-721,GETDATE()),112),减60年的日期以yymmdd格式输出195412XX
substring从195412XX提取195412