Tsql 如何使用两个日期变量比较两个日期字段

Tsql 如何使用两个日期变量比较两个日期字段,tsql,Tsql,我有一张桌子如下 ID bigint TaskName nvarchar(50) StartDate datetime -- Start date of task EndDate datetime -- End Date Of Task 我正在尝试编写一个过程,它接受两个输入@FromDate和@EndDate 作为datetime,获取输入参数之间正在处理的任务名列表 有人能帮我写下它的Where条件吗 感谢和问候, Rohan类似以下的东西应该适合您

我有一张桌子如下

ID        bigint
TaskName  nvarchar(50)
StartDate datetime      -- Start date of task
EndDate   datetime      -- End Date Of Task
我正在尝试编写一个过程,它接受两个输入@FromDate和@EndDate 作为datetime,获取输入参数之间正在处理的任务名列表

有人能帮我写下它的Where条件吗

感谢和问候,
Rohan

类似以下的东西应该适合您:

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

第一个任务获取从开始日期到结束日期之间的所有任务。第二个将获取从开始日期到结束日期之间启动的所有任务(无论结束时间如何)。

类似于以下内容的内容应该适用于您:

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

第一个任务获取从开始日期到结束日期之间的所有任务。第二个在开始日期和结束日期之间得到所有启动的任务(不管结束时间)。

,您不指定是否考虑时间或包含端点,但我不打算写出每个可能的组合。这考虑了时间,并允许包括终点:

SELECT
    *
    FROM YourTable
    WHERE StartDate>=@StartDate AND EndDate<=@EndDate
选择
*
从你的桌子上

在StaseDe>>=StestDead和EdDATE>

中,您不指定是否考虑时间或包含端点,但我不打算写出每个可能的组合…这考虑了时间,并允许包括终点:

SELECT
    *
    FROM YourTable
    WHERE StartDate>=@StartDate AND EndDate<=@EndDate
选择
*
从你的桌子上
其中StartDate>=@StartDate和EndDate
其中(StartDate<@Fromdate)和(EndDate>@EndDate)
将给出在@FromDate之前开始但在@EndDate之前未完成的任务。

其中(StartDate<@FromDate)和(EndDate>@EndDate)
WHERE StartDate <= @EndDate AND EndDate >= @FromDate
将给出在@FromDate之前开始但在@EndDate之前未完成的任务。

其中StartDate=@FromDate
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
DECLARE@Data表(StartDate-DATETIME,EndDate-DATETIME,ID-INTEGER)
插入@数据
选择'2009-05-10','2009-05-20',1
联合
选择'2009-05-15','2009-05-20',2
联合
选择'2009-05-01','2009-06-01',3
声明@FromDate DATETIME
声明@EndDate-DATETIME
设置@FromDate='2009-05-11'
设置@EndDate='2009-05-18'
从@Data中选择*
其中StartDate=@FromDate
其中StartDate=@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
DECLARE@Data表(StartDate-DATETIME,EndDate-DATETIME,ID-INTEGER)
插入@数据
选择'2009-05-10','2009-05-20',1
联合
选择'2009-05-15','2009-05-20',2
联合
选择'2009-05-01','2009-06-01',3
声明@FromDate DATETIME
声明@EndDate-DATETIME
设置@FromDate='2009-05-11'
设置@EndDate='2009-05-18'
从@Data中选择*
其中StartDate=@FromDate
您可以这样做

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

select * from tablename
where StartDate between @FromDate and @EndDate
你可以这样做

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

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

更新:在与Ada进行了很好的讨论之后,我看到他的查询是如何成为最佳解决方案的。虽然我下面的答案可行,但它是多余的。看在历史的份上,我将把这个答案留在这里+1对Ada的回答

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

两个时隙重叠,如果:

  • 任务1的开始时间介于任务2的开始时间和结束时间之间,或
  • 任务1的结束时间介于任务2或任务2的开始和结束时间之间
  • 开始和结束时间
我在预订系统中成功地使用了这种方法,以防止预订中的任何重叠

到目前为止,在回答中,我还没有看到检查这两个条件的查询。以下是我的尝试:

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

WHERE((StartDate>=@FromDate)和(StartDate=@FromDate)和(EndDate更新:与Ada充分讨论后,我发现他的查询是最佳解决方案。虽然我下面的答案可行,但它是多余的。为了历史起见,我将这个答案留在这里。+1是Ada的答案

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

两个时隙重叠,如果:

  • 任务1的开始时间介于任务2的开始时间和结束时间之间,或
  • 任务1的结束时间介于任务2或任务2的开始和结束时间之间
  • 开始和结束时间
我在预订系统中成功地使用了这种方法,以防止预订中的任何重叠

到目前为止,在回答中,我还没有看到检查这两个条件的查询。以下是我的尝试:

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

其中((StartDate>=@FromDate)和(StartDate=@FromDate)和(EndDate)是否希望任务在指定的时间范围内重叠或完全执行?(即,如果任务在@FromDate之前开始,但在@FromDate和@EndDate之间结束,是否希望将其包含在结果中?)您是否希望任务在指定的时间范围内重叠或完全执行?(即,如果任务在@FromDate之前开始,但在@FromDate和@EndDate之间结束,是否希望将其包含在结果中?)这将返回在范围之前开始并在范围之后结束的任务,而不是在范围内的任务range@KM-不,那不是真的。你试过了吗?我会用我用来测试各种场景的示例代码编辑我的帖子。当我运行你的代码时,我得到了“2009-05-01”-“2009-06-01”的行,对我来说,它不在你给定的日期范围“2009-05-11”之内“2009-05-18”我必须再看一次。@AdaTheDev是对的。这个问题有很多微妙的方式会失败,所以我的道具(向上投票)是失败的。@KM-这是正确的,不是吗?那一行是在2009-05-11和2009-05-18之间进行的,只是不完全在提供的日期范围内,但根据定义,在这两个日期之间是“进行中”