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