我有一个表格如下
ID bigint
TaskName nvarchar(50)
StartDate datetime -- Start date of task
EndDate datetime -- End Date Of Task
我正在尝试编写一个带有两个输入@FromDate和@EndDate的过程 as datetime,获取输入参数之间正在处理的TaskNames列表。
任何正文都可以帮我写出Where条件吗
谢谢和问候, 罗汉
答案 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。
据我所知,他希望在指定日期之间的任何时刻检索正在处理的任何任务。这意味着部分重叠的任务以及在时间间隔内开始和结束的任务。
如果符合以下两个时段重叠:
我已在预订系统中成功使用此方法,以防止预订重叠。
到目前为止,在答案中我还没有看到检查这两种情况的查询。这是我的尝试:
WHERE ( (StartDate >= @FromDate) AND (StartDate <= @EndDate) )
OR ( (EndDate >= @FromDate) AND (EndDate <= @EndDate) )
OR ( (StartDate <= @EndDate) AND (EndDate >= @StartDate) )