Получить конкретную дату между пересеченными датами SQL Server

У меня есть таблица для дат, и когда пользователь вводит дату, я хочу получить одну запись с правильным диапазоном значений. Проблема в том, что диапазоны дат пересекаются.

Это данные таблицы, которые у меня есть

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

Вы не хотите и не нуждаетесь в петле здесь. Вы просто пытаетесь получить список возрастающих дат между двумя датами?

Sean Lange 18.12.2018 14:59

Недостаточно объяснений. Что такое «неправильное значение»? что такое «правильная стоимость»? Какое отношение имеет этот код к вашим "табличным данным"?

Tab Alleman 18.12.2018 15:04

Например, когда я ввожу 2019-05-1, я должен получить запись 1, а когда я ввожу 2019-12-05, я должен получить запись 2. Когда я ввожу 219-12-05, я получаю 2 записи, что неверно.

Daina Hodges 18.12.2018 15:06

Но почему вы делаете это в цикле ???

Sean Lange 18.12.2018 15:09
при входе 2019-05-1 я должен получить запись 1 зачем вам эта запись? Это значение вообще не попадает в диапазон.
S3S 18.12.2018 15:11

Вы можете также взглянуть на это. sqlblog.org/2011/10/19/…

Sean Lange 18.12.2018 15:13

@TabAlleman Это действительно хороший вопрос

T.S. 18.12.2018 18:32

@ Т.С. Извините, но даже после вашего редактирования я все еще считаю вопрос совершенно неясным. Я вижу, что плакат принял ответ, поэтому, если кто-то не может отредактировать вопрос, чтобы сделать его полезным для будущих читателей, я голосую оставить его закрытым.

Tab Alleman 18.12.2018 19:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
8
84
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам не нужны все переменные. Достаточно простого предложения where.

SELECT *
FROM [t_dates]
WHERE Sartdate <= @dateQuery and EndDate >= @dateQuery

Это вернет записи, в которых ваш @dateQuery попадает в диапазон между Sartdate и EndDate. Я также предполагаю, что Sartdate - это опечатка в вашем сообщении, но я оставил ее здесь для ясности.

Почему вы проголосовали за его закрытие, это правильный вопрос?

T.S. 18.12.2018 18:34

Был до редактирования

S3S 18.12.2018 18:39

Поэтому вам следует выставить его на повторное открытие. быть справедливым

T.S. 18.12.2018 18:41

Я не знал, что оно закрылось. Почему ты говоришь, что я несправедлив? Это довольно обидно

S3S 18.12.2018 18:42

что ты имеешь в виду? - вы проголосовали за закрытие этого вопроса. Но это достойный вопрос. Вы также отправили ответ и заработали 10 баллов. Зачем голосовать за его закрытие, если вы на него ответили? Может быть, у меня есть свой вариант ответа, и я хочу его опубликовать.

T.S. 18.12.2018 18:48

Я бы сказал, что в настоящее время это еще не большой вопрос. Образцы данных представляют собой беспорядок, и объяснения в вопросе практически не существует. Ясность исходила от людей, пытающихся ответить на него. И ОП уже выбрал ответ в качестве решения.

Sean Lange 18.12.2018 18:49

@SeanLange Я категорически не согласен. Я сразу понял вопрос. Я не смотрел на код, но сразу стало ясно, что есть 2 диапазона дат, и OP необходимо выбрать диапазон с последним началом, если дата подпадает под оба. Если вопросы типа "что такое getdate () в MySql" не вызывают претензий - это нормальный вопрос ... stackoverflow.com/questions/3246791/getdate-in-mysql

T.S. 18.12.2018 18:53

Что вам мешает добавить ответ? И мой ответ был предположением, которое все еще не соответствует выборке данных. Мы с @SeanLange не отвечаем за точки доступа в Интернет, но если это ваше дело, тогда ладно. Мы просто пытаемся помочь людям и комментируем гораздо больше, чем отвечаем.

S3S 18.12.2018 19:01

Когда вопрос закрыт, никакой ответ не может быть добавлен по дизайну этого сайта. Какой бы ни была миссия, все, что я прошу, это посмотреть и сказать [в текущем отредактированном формате], это неправильный вопрос? Есть гораздо худшие, которые живут и хорошо

T.S. 18.12.2018 19:07
Ответ принят как подходящий
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

Другие вопросы по теме