Sql Server — получение дат из базы данных между указанным диапазоном

#sql #sql-server

#sql #sql-server

Вопрос:

У меня проблема с получением записей, если FtableID в любой точке диапазона (дата начала и дата окончания) имеет StatusID = 2.

Моя структура таблицы

ID FTableID StatusID AddedOn
75324 53591 1 2019-03-17 06:48:14.490
75325 53591 2 2019-03-18 06:48:14.663
75326 53591 3 2019-03-19 06:54:20.830

 @StartDate Datetime='2019/03/17 23:00:00' ,            
@EndDate Datetime='2019/03/20 23:59:59' 

Select ID, FTableID,StatusID,AddedOn from MyTableName where FTableID=53591
And StatusID=2 and AddedOn <= @EndDate 
 

Я знаю, что мой запрос неверен, и он выдает запись, даже когда я передаю @startdate после изменения его статуса на 3 (завершено)

Я не понимаю, как установить фильтр начальной даты.

Мне нужно проверить, находится ли эта запись FtableID в состоянии id = 2 в любой точке предоставленного диапазона

Запись должна появиться, если я передам @StartDate Datetime=’2019/03/18 23:00:00′, @ Конечная дата Datetime=’2019/03/20 23:59:59′ потому что именно в этом диапазоне он был в статусе = 2

Запись не должна появиться, если я передам @StartDate Datetime=’2019/03/19 23:00:00′, @ Конечная дата Datetime=’2019/03/20 23:59:59′, потому что он был преобразован в StatusID=3

Пожалуйста, предложите мне это. Заранее спасибо.

Комментарии:

1. Хм, итак, если у вас есть эта @StartDate переменная, то почему бы не использовать ее в SQL? Т.Е. and AddedOn >= @StartDate Или проблема в том, что @StartDate после этого datetime состояния 2?

Ответ №1:

используйте это

 select * 
from YourTableName
where AddedOn between (@StartDate and @EndDate)
and StatusID=2
 

Ответ №2:

Используется один метод exists .

Я бы также упростил вашу арифметику дат, поэтому:

объявить @StartDate datetime ‘2019-03-17 23:00:00’; объявить @EndDate datetime = ‘2019-03-20’

 select t.*
from mytablename t
where exists (select 1
              from mytablename t2
              where t2.ftableid = t.ftableid and
                    t2.statusid = 2 and
                    t2.AddedOn >= @StartDate and
                    t2.AddedOn < @EndDate 
             );