Sql 如何从日期中获取下一个记录日期和最后一个记录日期?

Sql 如何从日期中获取下一个记录日期和最后一个记录日期?,sql,sql-server,date,Sql,Sql Server,Date,我使用以下结构创建表格约会: CREATE TABLE Appointments ( [Id] bigint, [Name] varchar(250), [DateInit] date ); INSERT INTO Appointments ([Id], [Name], [DateInit]) values (1000, 'Lorena', '03/06/2016'), (1000, 'Lorena', '01

我使用以下结构创建表格约会:

  CREATE TABLE Appointments
    (
         [Id] bigint, 
         [Name] varchar(250),
         [DateInit] date
    );


INSERT INTO Appointments ([Id],  [Name],  [DateInit])
values 
(1000, 'Lorena', '03/06/2016'),
(1000, 'Lorena', '01/06/2016'),
(1000, 'Lorena', '08/06/2016'),
(1000, 'Lorena', '10/06/2016'),
(1000, 'Lorena', '02/06/2016'),
(1000, 'Lorena', '20/06/2016'),
(7000, 'Susan', '04/06/2016'),
(7000, 'Susan', '08/06/2016'),
(7000, 'Susan', '09/06/2016'),
(7000, 'Susan', '01/06/2016');
这是最终结果:

我需要获得第二天和前一天的结果,例如,如果今天是'03/06/2016',我需要获得从今天开始插入表中的最后一个约会的结果,以及从今天开始插入表中的下一个约会的结果,我需要的结果如下:

   Name    Last Visit    Next Visit
    -----   ----------    -----------
   Lorena   2016-06-02    2016-06-08
   Susan    2016-06-01    2016-06-04
我怎样才能得到这个结果?
谢谢

我会在参加上一次和下一次访问时这样做,就像这样

SELECT DISTINCT
     a.ID
    ,a.NAME
    ,l.LastVisit
    ,n.NextVisit
FROM Appointments a
LEFT JOIN (
    SELECT ID
        ,MIN(DateInit) NextVisit
    FROM Appointments
    WHERE DateInit > GETDATE()
    GROUP BY ID
    ) n ON a.ID = n.ID
LEFT JOIN (
    SELECT ID
        ,MAX(DateInit) LastVisit
    FROM Appointments
    WHERE DateInit < GETDATE()
    GROUP BY ID
    ) l ON a.ID = l.ID
执行分组依据,使用案例表达式选择最大先前约会和最小未来约会:

select name,
       max(case when DateInit < CONVERT(DATE,GETDATE()) then DateInit end) as LastVisit,
       min(case when DateInit > CONVERT(DATE,GETDATE()) then DateInit end) as NextVisit
from Appointments
group by name

您能以文本格式包含示例数据吗?@GiorgosBetsos我在MS SQL Server中添加了插入寄存器current_DATE=GETDATE,但它是在datetime上。所以只需使用CONVERTDATE、GETDATE来显示日期。@jarlh我收到了这个错误消息,在“min”最后一次访问附近的sytanx不正确,而不是case Condition。如果我们使用MIN@Esraa_92,很高兴听到。@Esraa_92请注意,要使其正常工作,DateInit必须始终不带timepart。同时感谢您的帮助
DECLARE  @Appointments TABLE
    (
         [Id] bigint, 
         [Name] varchar(250),
         [DateInit] date
    );


INSERT INTO @Appointments ([Id],  [Name],  [DateInit])
values 
(1000, 'Lorena','2016/06/03'),
(1000, 'Lorena','2016/06/01'),
(1000, 'Lorena','2016/06/08'),
(1000, 'Lorena','2016/06/10'),
(1000, 'Lorena','2016/06/02'),
(1000, 'Lorena','2016/06/20'),
(7000, 'Susan', '2016/06/04'),
(7000, 'Susan', '2016/06/08'),
(7000, 'Susan', '2016/06/09'),
(7000, 'Susan', '2016/06/01');

DECLARE @Today DATE = GETDATE();

WITH CTE
AS (
    SELECT A.NAME
        ,ROW_NUMBER() OVER (
            PARTITION BY ID ORDER BY ID
            ) RN
        ,(
            SELECT TOP 1 DateInit
            FROM @Appointments B
            WHERE B.ID = A.ID
                AND DateInit < @TODAY
            ORDER BY DateInit DESC
            ) [Last Visit]
        ,(
            SELECT TOP 1 DateInit
            FROM @Appointments B
            WHERE B.ID = A.ID
                AND DateInit > @TODAY
            ORDER BY DateInit
            ) [Next Visit]
    FROM @Appointments A
        --GROUP BY ID
    )
SELECT C.NAME
    ,C.[Last Visit]
    ,C.[Next Visit]
    ,RN
FROM CTE C
WHERE RN = 1