У меня есть таблица для дат, и когда пользователь вводит дату, я хочу получить одну запись с правильным диапазоном значений. Проблема в том, что диапазоны дат пересекаются.
Это данные таблицы, которые у меня есть
Record 1 | Sartdate 2019/01/01 | Enddate 2019/12/31
Record 2 | Sartdate 2019/12/01 | Enddate 2019/12/31
Например, когда я ввожу 2019-05-1
, я должен получить запись 1, а когда я ввожу 2019-12-05
, я должен получить запись 2. Когда я ввожу 219-12-05
, я получаю 2 записи, что неверно.
Я создал инструкцию SQL, но каждый раз получаю неправильное значение и не знаю, как это исправить
declare @currentrow int = 0
set @dateQuery = '2018-04-01'
select @count = count(*) from [dbo].[t_dates]
while @currentrow < @count
begin
select @dateFrom = [date_from], @dateTo = [date_to]
from [t_dates]
where date_id = @currentrow + 1
select @dateId = date_id
from [dbo].[t_dates]
where ((@dateQuery between @dateFrom and @dateTo))
print @dateId
print @dateFrom
print @dateTo
set @currentrow = @currentrow + 1
end
Недостаточно объяснений. Что такое «неправильное значение»? что такое «правильная стоимость»? Какое отношение имеет этот код к вашим "табличным данным"?
Например, когда я ввожу 2019-05-1, я должен получить запись 1, а когда я ввожу 2019-12-05, я должен получить запись 2. Когда я ввожу 219-12-05, я получаю 2 записи, что неверно.
Но почему вы делаете это в цикле ???
Вы можете также взглянуть на это. sqlblog.org/2011/10/19/…
@TabAlleman Это действительно хороший вопрос
@ Т.С. Извините, но даже после вашего редактирования я все еще считаю вопрос совершенно неясным. Я вижу, что плакат принял ответ, поэтому, если кто-то не может отредактировать вопрос, чтобы сделать его полезным для будущих читателей, я голосую оставить его закрытым.
Вам не нужны все переменные. Достаточно простого предложения where.
SELECT *
FROM [t_dates]
WHERE Sartdate <= @dateQuery and EndDate >= @dateQuery
Это вернет записи, в которых ваш @dateQuery
попадает в диапазон между Sartdate
и EndDate
. Я также предполагаю, что Sartdate
- это опечатка в вашем сообщении, но я оставил ее здесь для ясности.
Почему вы проголосовали за его закрытие, это правильный вопрос?
Был до редактирования
Поэтому вам следует выставить его на повторное открытие. быть справедливым
Я не знал, что оно закрылось. Почему ты говоришь, что я несправедлив? Это довольно обидно
что ты имеешь в виду? - вы проголосовали за закрытие этого вопроса. Но это достойный вопрос. Вы также отправили ответ и заработали 10 баллов. Зачем голосовать за его закрытие, если вы на него ответили? Может быть, у меня есть свой вариант ответа, и я хочу его опубликовать.
Я бы сказал, что в настоящее время это еще не большой вопрос. Образцы данных представляют собой беспорядок, и объяснения в вопросе практически не существует. Ясность исходила от людей, пытающихся ответить на него. И ОП уже выбрал ответ в качестве решения.
@SeanLange Я категорически не согласен. Я сразу понял вопрос. Я не смотрел на код, но сразу стало ясно, что есть 2 диапазона дат, и OP необходимо выбрать диапазон с последним началом, если дата подпадает под оба. Если вопросы типа "что такое getdate () в MySql" не вызывают претензий - это нормальный вопрос ... stackoverflow.com/questions/3246791/getdate-in-mysql
Что вам мешает добавить ответ? И мой ответ был предположением, которое все еще не соответствует выборке данных. Мы с @SeanLange не отвечаем за точки доступа в Интернет, но если это ваше дело, тогда ладно. Мы просто пытаемся помочь людям и комментируем гораздо больше, чем отвечаем.
Когда вопрос закрыт, никакой ответ не может быть добавлен по дизайну этого сайта. Какой бы ни была миссия, все, что я прошу, это посмотреть и сказать [в текущем отредактированном формате], это неправильный вопрос? Есть гораздо худшие, которые живут и хорошо
SELECT top 1 [date_from],[date_to]
FROM [t_dates]
WHERE @dateQuery between [date_from] AND [date_to]
ORDER BY [date_to] desc,[date_from] desc
Вы не хотите и не нуждаетесь в петле здесь. Вы просто пытаетесь получить список возрастающих дат между двумя датами?