#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
);