我有一个场景需要比较单个结果集中的日期。 例如,如果我有一个包含5行具有不同日期的表。
Table1
ID DATE
1 2014/01/01
2 2014/02/01
3 2014/03/01
4 2014/04/01
5 2014/05/02
在上表中,我需要根据日期差异返回true或false。因此,如果日期差异为30的两个日期中的任何一个,那么它将返回true。
我想在SQL中执行此操作。
我试过
SELECT
case when count(*)>0 then 1 else 0 end
FROM
Table AS T1 CROSS JOIN Table AS T2
WHERE
DATEDIFF(DD,T1.VISIT_DATE,T2.VISIT_DATE)<=30
但是上面的查询没有按预期工作。 我需要一些建议。
提前致谢
答案 0 :(得分:0)
您必须使用(相关的)子查询:
SELECT LessThan30days = CAST(CASE WHEN EXISTS
(
SELECT 1 FROM Table AS T2
WHERE DATEDIFF(DD,T1.VISIT_DATE,T2.VISIT_DATE) <= 30)
THEN 1 ELSE 0 END AS BIT)
FROM Table AS T1
答案 1 :(得分:0)
假设你有SQL Server 2012或更高版本,我认为这是你正在寻找的:
DECLARE @example TABLE (ID int, DT datetime)
INSERT INTO @example(ID, DT)
SELECT 1,'2014/01/01'
UNION SELECT 2,'2014/02/01'
UNION SELECT 3,'2014/03/01'
UNION SELECT 4,'2014/04/01'
UNION SELECT 5,'2014/05/02'
;with rowsWithDayDifference as (
SELECT ID, DT, DATEDIFF(day,LAG(DT) OVER (ORDER BY DT),DT) as DayDifference
FROM @example
)
select *, CASE WHEN DayDifference<=30 THEN 1 ELSE 0 END Is30DaysOrLess
from rowsWithDayDifference
答案 2 :(得分:0)
-- sample data start
declare @t table (id int, d datetime)
insert into @t values (1, '2014/01/01')
insert into @t values (2, '2014/02/01')
insert into @t values (3, '2014/03/01')
insert into @t values (4, '2014/04/01')
insert into @t values (5, '2014/05/02')
-- sample data end
select t1.*, t2.d as d2, datediff(day, t2.d, t1.d)
from @t t1 left outer join @t t2 on (t1.id-1) = t2.id