我有一个数据库表,其中包含员工证书的开始日期和到期日期。我需要查询该表以获取在某个日期范围内认证的员工。
示例表:
EmpID | FromDate | ExpireDate
---------+-------------+--------------
1 | 2/1/2011 | 3/1/2015
2 | 10/1/2010 | 2/1/2013
3 | 3/1/2013 | 5/30/2013
4 | 11/1/2000 | 3/1/2012
5 | 5/6/2013 | 5/30/2017
如果用户想要查找在2013年5月1日到2013年5月30日之间认证的员工,他们应该返回员工id 1,3和5。请注意,虽然FromDate在查询的开始日期(5/1/2013)之后,但雇员id 5是在日期范围内认证的。
希望这有意义。
假设您的日期确实被存储为日期,那么以下操作应该可以工作:
select t.*
from t
where FromDate <= '5/30/2013' and
EndDate >= '5/1/2013';
逻辑是FromDate
小于周期的末尾,而EndDate
在周期的开始之后。这样就不会和句号重叠了
查询将为:
declare @FromDate datetime
declare @ToDate datetime
set @FromDate = '1-May-2013'
set @ToDate = '30-May-2013'
select * from emp
where (@FromDate <= FromDate And @ToDate > FromDate And @ToDate < ExpireDate)
Or (@FromDate >= FromDate And @ToDate between FromDate and ExpireDate)
在这里,这两个条件分别提到并使用or操作符添加。它将帮助您以更合乎逻辑的方式写下查询。
你必须选择
SELECT EmpId FROM tableName WHERE FromDate <= endDateRange AND
ExpireDate>=startDateRange
看起来这个查询有3个场景。
考虑5/1/2013为st_dt2013年5月30日为end_dt
Select EmpID from tablename WHERE
(st_dt > FromDate AND end_dt < ExpireDate) OR
(st_dt > FromDate AND end_dt > ExpireDate) OR
(st_dt < FromDate AND end_dt < ExpireDate);
在这个查询中做一些修改,比如表名等。你肯定会得到答案的。