我正在尝试过滤一些值,我需要知道它们是否可以介于两个日期之间,但我无法创建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
是。
答案 0 :(得分: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
答案 1 :(得分:1)
以下方法如何:
你可能会遇到2月29日的麻烦
答案 2 :(得分: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;
答案 3 :(得分: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'
答案 4 :(得分: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