sql server日期范围标准

时间:2014-02-13 08:43:36

标签: asp.net sql sql-server tsql

我正在研究asp.net项目。我有两个日期存储在数据库中以供空缺。发布日期和截止日期。我希望如果用户搜索任何有日期范围的空缺,那么如果空缺的开始日期或结束日期落在该范围内,那么应该选择它。就像用户选择日期范围3月10日到4月10日,空缺开始日期是MArch 1,截止日期是3月20日那样它应该是shwon。

虚拟sql

select *
from vacancies v
where v.start date in date range or
      v. end date in date range

它将是什么样的SQL

2 个答案:

答案 0 :(得分:0)

如果您意识到开始日期和截止日期只是形成另一个范围,那么这只是查询用户指定范围和空缺范围之间的所有重叠的查询:

declare @StartRange datetime
declare @EndRange datetime
select @StartRange='20140310',@EndRange='20140410'

select
    *
from vacancies v
where v.startdate <= @EndRange and
      @StartRange <= v.deadline

(可能需要对<=<进行调整,具体取决于您是否考虑使用包含端点或独占端点的范围。

基本逻辑是 - 如果第一个范围在第二个范围结束之前开始,则两个范围重叠,第二个范围在第一个范围结束之前开始。

这也可以选择,例如在用户指定范围之前具有开始日期的职位空缺和用户指定范围之后的截止日期。这与您的虚拟sql不匹配,但通常是可取的(即空位在整个用户指定的范围内打开)

答案 1 :(得分:0)

你想做类似的事情:

SELECT * 
FROM Vacancies v
WHERE v.StartDate Between @UserProvidedStartDate and @UserProvidedEndDate
   OR v.EndDate Between @UserProvidedStartDate and @UserProvidedEndDate

这假定您具有使用用户搜索条件传递的参数。

我看到的问题是,您将在截止日期过后返回空缺。如果您从查询中排除空缺开始日期,您将只显示截止日期在标准范围内的空缺。在这种情况下你只会这样做:

SELECT * 
FROM Vacancies v
WHERE v.EndDate Between @UserProvidedStartDate and @UserProvidedEndDate