筛选一段时间过生日的会员,会遇到以下几个问题:
1、时间以月和日来计算
2、跨月问题
3、跨年问题
现提供一个思路,类似于黑盒与白盒的概率。
把会员的生日的“年”的部分都转成和筛选时间的“年”的部分一致,然后用“between .. and ..” 来搜索。
改变日期,T-SQL提供了两个方法,DateAdd 和 DateDiff 。
简单介绍下,DateAdd 通过向指定日期添加间隔,返回新的 datetime 值,DateDiff 返回跨越两个指定日期的日期和时间边界的数目。
语句可以写成:
declare @StartDate datetime --起始时间
declare @EndDate datetime --结束时间
select * from [table] where
dateadd(yy,datediff(yy,Birthday,@StartDate),birthday) between @StartDate and @EndDate+1
or dateadd(yy,datediff(yy,Birthday,@EndDate),birthday) between @StartDate and @EndDate+1
declare @EndDate datetime --结束时间
select * from [table] where
dateadd(yy,datediff(yy,Birthday,@StartDate),birthday) between @StartDate and @EndDate+1
or dateadd(yy,datediff(yy,Birthday,@EndDate),birthday) between @StartDate and @EndDate+1
有几点说明:
1、一般性情况,起始时间不大于结束时间;
2、分别对起始时间和结束时间操作,解决了跨年的问题;
3、结束时间加1是按完整天数技术,包括时分秒。