如何比较两个日期字段与两个日期变量

时间:2009-07-14 14:34:02

标签: tsql

我有一个表格如下

ID        bigint
TaskName  nvarchar(50)
StartDate datetime      -- Start date of task
EndDate   datetime      -- End Date Of Task

我正在尝试编写一个带有两个输入@FromDate和@EndDate的过程 as datetime,获取输入参数之间正在处理的TaskNames列表。

任何正文都可以帮我写出Where条件吗

谢谢和问候, 罗汉

6 个答案:

答案 0 :(得分:4)

WHERE StartDate <= @EndDate AND EndDate >= @FromDate

应该做的伎俩

编辑:我用于测试各种方案的示例代码:

DECLARE @Data TABLE (StartDate DATETIME, EndDate DATETIME, ID INTEGER)
INSERT @Data 
SELECT '2009-05-10','2009-05-20', 1
UNION
SELECT '2009-05-15','2009-05-20', 2
UNION 
SELECT '2009-05-01','2009-06-01', 3

DECLARE @FromDate DATETIME
DECLARE @EndDate DATETIME
SET @FromDate = '2009-05-11'
SET @EndDate = '2009-05-18'

SELECT * FROM @Data
WHERE StartDate <= @EndDate AND EndDate >= @FromDate

答案 1 :(得分:0)

以下内容适用于您:

select * from myTable
where StartDate > @FromDate
and EndDate < @EndDate

或类似

select * from myTable
where StartDate between @FromDate and @EndDate

第一个获取介于您的结束日期和结束日期之间的所有任务。第二个获取在您的结束日期和结束日期之间开始的所有任务(无论结束时间)。

答案 2 :(得分:0)

您没有指定是否要考虑时间或包含端点,但我不会写出每个可能的组合......这会考虑时间并允许包含端点:

SELECT
    *
    FROM YourTable
    WHERE StartDate>=@StartDate AND EndDate<=@EndDate

答案 3 :(得分:0)

WHERE (StartDate < @Fromdate ) AND ( EndDate > @EndDate )

将提供比@FromDate更早但未在@EndDate之前完成的任务。

答案 4 :(得分:0)

你可以这样做。

Create procedure sp_name
(@fromdate as datetime,
@Enddate as datetime
) 
as

select * from tablename
where StartDate between @FromDate and @EndDate

答案 5 :(得分:0)

更新:经过与Ada的良好讨论后,我看到他的查询是如何最佳解决方案。虽然我的答案可行,但这是多余的。为了历史,我会在这里留下这个答案。给Ada的答案+1。

据我所知,他希望在指定日期之间的任何时刻检索正在处理的任何任务。这意味着部分重叠的任务以及在时间间隔内开始和结束的任务。

如果符合以下两个时段重叠:

  • 任务1的开始时间落在任务2的开始和结束时间之间的任何位置或
  • 任务1的结束时间落在任务2的开始和结束时间之间的任何位置或
  • 的开始和结束时间

我已在预订系统中成功使用此方法,以防止预订重叠。

到目前为止,在答案中我还没有看到检查这两种情况的查询。这是我的尝试:

WHERE ( (StartDate >= @FromDate) AND (StartDate <= @EndDate) )
OR ( (EndDate >= @FromDate) AND (EndDate <= @EndDate) )
OR ( (StartDate <= @EndDate) AND (EndDate >= @StartDate) )