2014-09-26 4 views
0

Я пытаюсь отфильтровать некоторые значения, и мне нужно знать, могут ли они быть между двумя датами или нет, но я не мог создать SQL для этого.Как мне получить дату между двумя датами?

У меня есть следующая дата: May 10 2010.

Мне нужно найти, может ли эта дата быть между двумя датами, если я добавлю несколько лет на нее.

Пример 1: может ли эта дата быть между January 15 2014 и June 20 2014?

Да, поскольку May 10 2014 есть.

Пример2: может ли эта дата быть между May 15 2014 и June 20 2014?

Нет, поскольку May 10 2014 и May 10 2015 не находятся между этими интервалами.

Пример 3: может ли эта дата быть между December 15 2013 и June 20 2014?

Да, поскольку May 10 2014 есть.

ответ

1

Это немного сложнее в SQL Server. Я думаю, что лучший способ - нормализовать даты до 1 января, исходя из того, когда начинается период. Затем вы можете безопасно использовать datediff(), чтобы добавить соответствующее значение года.

Что-то вроде этого:

select (case when dateadd(year, datediff(year, newdate, newstart), newdate) 
         between newstart and newend 
      then 'Between' else 'NotBetween' 
     end) 
from (select (StartDate - datepart(dayofyear, startDate) + 1) as newstart 
      (EndDate - datepart(dayofyear, StartDate) + 1) as newend, 
      (TheDate - datepart(dayofyear, StartDate) + 1) as newdate 
     from (select cast('2013-12-15' as datetime) as StartDate, 
        cast('2014-06-20' as datetime) as EndDate, 
        cast('2010-05-10' as datetime) as thedate 
      ) dates 
    ) dates; 
+1

Обратите внимание, что 'CAST ('2010-05-10' AS datetime)' будет 5 октября в Европе. Всегда используйте языковые литералы с независимыми языками. т.е. «20100510» – adrianm

+0

@adrianm. , , Я собираюсь придерживаться стандартных форматов даты ISO и считаю это ошибкой в ​​SQL Server. Я, вероятно, в меньшинстве по этому мнению. –

1

Как насчет следующего подхода:

  • если ваша дата начала диапазона дата и дата окончания оба в том же году, а затем проверить, если дата с заменой год с годом диапазона падает между диапазоне ;
  • , если срок действия даты истекает на год более чем на год больше, чем в начале года, а затем проверьте, совпадает ли дата с заменой года на год даты начала диапазона между вашим диапазоном или если дата с заменой даты год с годом даты окончания диапазона находится между вашим диапазоном;
  • если ваш конечный диапазон дат года составляет не менее 2-х лет больше, чем ваш старт диапазон дат года, то он всегда будет работать

Вы могли бы хотя попасть в беду с 29 февраля

0

вот пример

DECLARE @input datetime ='May 10 2010' 

set @input = (select dateadd(year, 4, @input)) 



select * from T 
where @input >= 'January 15 2014' 
       and @input <= 'June 20 2014' 
2

Вы можете попробовать что-то вроде этого:

declare @intervals table (StartDate date, EndDate date); 
declare @date date = '2010-05-10'; 

insert into @intervals values 
    ('2014-01-15', '2014-06-20'), 
    ('2014-05-15', '2014-06-20'), 
    ('2013-12-15', '2014-06-20'); 

select case when dateadd(year,year(EndDate)-year(@date),@date) 
       between StartDate and EndDate 
      then 'Yes' 
      else 'No' 
     end, 
     StartDate, 
     EndDate 
    from @intervals; 

OUTPUT

 StartDate EndDate 
---- ---------- ---------- 
Yes 2014-01-15 2014-06-20 
No 2014-05-15 2014-06-20 
Yes 2013-12-15 2014-06-20 
0

Простой способ сделать это - проверить с помощью DateDiff.

DECLARE @input datetime ='May 10 2014' 

select case when DATEDIFF(d,'2014-01-15',@input) >=0 and DATEDIFF(d,@input, '2014-06-20') >= 0 then 'yes' else 'No' end 
Смежные вопросы