2014-09-26 110 views
0

我试图过滤一些值,我需要知道它们是否可以在两个日期之间,但我不能创建一个SQL来执行此操作。如何获得两个日期之间的日期?

我有以下日期:May 10 2010

我需要找到这个日期是否可以在两个日期之间,如果我添加几年。

例子1:这个日期可以在January 15 2014June 20 2014之间吗?

是的,因为May 10 2014是。

例子2:这个日期可以在May 15 2014June 20 2014之间吗?

不,因为May 10 2014May 10 2015不在此间隔之间。

例3:这个日期可以在December 15 2013June 20 2014之间吗?

是的,因为May 10 2014是。

回答

1

这在SQL Server中有点棘手。我认为最好的方法是根据时间段的开始将日期规范化为1月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)'将于10月5日在欧洲举行。始终使用区域设置独立的日期文字。即'20100510' – adrianm 2014-09-26 06:26:12

+0

@adrianm。 。 。我将坚持使用ISO标准日期格式,并认为这是SQL Server中的一个错误。不过,我可能在这个意见上是少数。 – 2014-09-26 11:15:34

1

如何以下方法:

  • 如果日期范围开始日期和结束日期均具有相同的年份,然后检查是否与该范围内的每年更换的一年日期落在你的范围之间;
  • 如果您的日期范围结束年份比您的日期范围开始年份多完整一年,则检查以范围开始日期的年份替换年份的日期是否落在您的范围之间或者替换日期范围结束日期的年份落在您的范围之间;
  • 如果您的日期范围结束一年至少2年以上的日期范围开始的一年,那么它会一直工作

你可能会虽然陷入困境与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; 

输出

 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 
相关问题