对于单个结果集中的记录的datediff

时间:2015-02-19 12:16:03

标签: sql sql-server

我有一个场景需要比较单个结果集中的日期。 例如,如果我有一个包含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

但是上面的查询没有按预期工作。  我需要一些建议。

提前致谢

3 个答案:

答案 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