在用户表中,有一个生日字段 birth,现在的需求是根据传入的时间段参数,查询此时间段内过生日的用户列表,需要考虑跨年的情况
查这些时间段的数据不需要考虑这些吧,我一直使用这个,没有出错过:http://blog.csdn.net/xuanzhangran/article/details/54708246
select * from 用户 where brith >= starttime and birth <= endtime
birth和时间段参数的格式一致就好了
如果你的业务,确实需要对跨年,请参考这个链接:http://blog.csdn.net/xuanzhangran/article/details/55666878
不需要考虑什么跨不跨年,直接传进时间,一样的时间格式进行查询
生日的判断标准是 几月几号 , 如果传入的时间段是同一年 比如说 2017-05-23 到 2017-06-23 直接取出月日比较肯定没问题啊,但是如果跨年了,就不好控制了,比如 2017-05-23 到 2018-02-01 这个时间段的话,就应该去查 05-23到12-31过生日的 和 01-01到 02-01过生日的
涉及到时间查询,最准确最稳妥的做法是使用DATEDIFF函数,如
StringBuilder sb = new StringBuilder();
sb.Append(" SELECT * FROM USERINFO WHERE 1=1");
sb.Append(" AND DATEDIFF(DAY,'{0}',birth)>=0", startTime);
sb.Append(" AND DATEDIFF(DAY,'{0}',birth)< 0", endTime);
其中,DATEDIFF函数最前边一个参数
DATEDIFF(YEAR,'',''),精确到年;
DATEDIFF(MONTH,'',''),精确到月;
DATEDIFF(DAY,'',''),精确到日;
DATEDIFF(HUOR,'',''),精确到小时;
DATEDIFF(MINUTE,'',''),精确到分;
等等,可以根据具体情况使用,你这个情况应该精确到日就可以了
根据你的需求,创建数据如下:
有两个分支:
先判断传入的时间段参数前后大小关系,如果后者比前者时间大,则涉及跨年的问题,应该执行
select * from user where substring(birthday,6)>='09-01' or substring(birthday,6)<='06-01';
否则,执行
select * from user where substring(birthday,6)>='02-01' and substring(birthday,6)<='06-01';