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之间进行的,只是不完全在提供的日期范围内,但根据定义,在这两个日期之间是“进行中”