查询以查找在一系列日期内处于活动状态的记录

时间:2014-05-21 15:10:11

标签: sql

我有一个数据库表,其中包含员工认证的开始和过期日期。我需要查询表格,以获得在日期范围内获得认证的员工。

示例表:

  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.请注意,员工ID 5在日期范围内已经过认证FromDate位于查询的开始日期之后(2013年5月1日)。

希望这是有道理的。我很难围绕如何编写查询。

4 个答案:

答案 0 :(得分:1)

假设您的日期确实存储为日期,则以下内容应该有效:

select t.*
from t
where FromDate <= '5/30/2013' and
      EndDate >= '5/1/2013';

逻辑是FromDate小于句点的结尾,EndDate在开头之后。这将与期间有任何重叠。

答案 1 :(得分:0)

查询将是:

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)

这里两个条件都单独提及并使用或运算符添加。它将帮助您以更合理的方式写下您的查询。

答案 2 :(得分:0)

看起来此查询有3种情况。

将2013年5月1日视为st_dt 和5/30/2013 as 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);

在此查询中进行某些更改,例如表名等。您肯定会得到答案。

答案 3 :(得分:0)

你必须选择

SELECT EmpId FROM tableName  WHERE FromDate <= endDateRange AND
ExpireDate>=startDateRange