SQL, чтобы получить ближайшую дату - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть этот запрос, который дает мне ближайшую дату, но не правильно, он работает только в одну сторону

select *
from Table1
where id = 80
  and startdate = (select top 1 startdate 
                   from Table1 
                   where id = 80
                   order by abs(convert(float, getdate() - StartDate)))

Где я хочу убедиться, что если есть дата, которая больше, и дата, которая являетсяменьше выбранной даты имеет наименьшее различие, он должен выбрать эту запись.

Есть идеи, что мне здесь не хватает?

Ответы [ 3 ]

0 голосов
/ 08 ноября 2019

в случае сценария, подобного сегодняшнему, 10-го декабря, а у вас 15-е и 5-е декабря, для упорядочения ближайших записей по убыванию начальной даты необходимо поставить более позднюю дату в верхнюю часть списка.

Я бы также использовал встроенную функцию DATEDIFF, рассматривая даты, поскольку FLOAT - это старая техника с некоторыми недостатками, включая возможные путаницы в отношении дробей дней

    select * from Table1 where id = 80 
         and startdate = (select top 1 startdate from Table1 
         where id = 80 
            order by 
                abs(DATEDIFF(day,getdate(),startdate)) ASC,  --use a built in function over FLOAT
                StartDate DESC)    --If there are equidistant dates, this will take the higher of those dates
0 голосов
/ 08 ноября 2019

Полагаю, вам просто нужно добавить startdate<>t1.startdate, как показано ниже в вашем запросе. Отсутствие которого может привести к тем же начальным датам, что и вывод

     select * from Table1 t1
      where id = 80 
     and startdate = (select top 1 
    startdate from Table1 
     where id = 80 and startdate<>t1. 
     startdate order by 
    abs(convert(float,getdate() - 
     StartDate)))
0 голосов
/ 08 ноября 2019

Если вам нужны строки с данными, аналогичными startdate с id = 80, вы можете использовать что-то вроде этого:

select top (3) t1.*
from (select t1.*,
             max(case when id = 80 then startdate end) over () as date_80
      from Table1 t1
     ) t1
order by abs(datediff(day, startdate, date_80));

Если вам нужна одна запись:

select top (1) t1.*
from (select t1.*,
             max(case when id = 80 then startdate end) over () as date_80
      from Table1 t1
     ) t1
where id <> 80
order by abs(datediff(day, startdate, date_80))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...