Torna al Thread
USE tempdb;
GO
-- xx Creo la tabella xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
CREATE TABLE #T1
(
[Id] int NOT NULL IDENTITY (1, 1) PRIMARY KEY,
[DaOr] datetime NOT NULL,
[Note] varchar(50) NULL
) ON [PRIMARY]
GO
-- xx Inserisco i dati xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
SET IDENTITY_INSERT #T1 ON
GO
INSERT #T1 ([Id], [DaOr], [Note]) VALUES
(1, N'2015-02-02T13:05:00', N'04 Deve Restare'),
(2, N'2015-02-02T11:10:00', N'03 Deve Restare'),
(3, N'2015-02-02T12:00:00', N'Elimina'),
(9, N'2015-12-10T15:32:00', N'Elimina'),
(10, N'2015-12-10T15:00:00', N'06 Deve Restare'),
(11, N'2015-12-10T16:52:00', N'07 Deve Restare'),
(12, N'2015-12-12T23:00:30', N'08 Deve Restare'),
(13, N'2015-06-04T22:00:00', N'05 Deve Restare'),
(14, N'2015-02-02T10:40:40', N'Elimina'),
(15, N'2015-01-02T14:00:08', N'01 Deve Restare'),
(16, N'2015-02-02T10:00:00', N'02 Deve Restare');
GO
SET IDENTITY_INSERT #T1 OFF
GO
-- xx mostro i dati prima della routine xxxxxxxxxxxxxxxxxxxxxx
SELECT [Id], [DaOr], [Note] FROM #T1 ORDER BY [DaOr];
GO
-- *****************************************************************************
-- xx La Procedura vera e propria xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-- 3600 La approssimazione in secondi per ritenere gli orari duplicati ( 1 ora )
DECLARE @Appx as int
SET @Appx = 3600
-- la OldDate di Base assunta per il 1° record, deve essere la minimissima ammissibile in modo che il 1° record sia sempre mantenuto
DECLARE @Base AS Datetime
SET @Base = (SELECT Min(DaOr) FROM #T1)
SET @Base = DATEADD(s, -(@Appx+1000), @Base)
-- print @Base
--dichiaro le variabili da leggere nel cursore
DECLARE @Idxx AS int
DECLARE @OlDa AS datetime
DECLARE @NwDa AS datetime
DECLARE Curs CURSOR FOR
SELECT [Id], [DaOr] FROM #T1 ORDER BY [DaOr]
OPEN Curs
FETCH NEXT FROM Curs INTO @Idxx, @NwDa
SET @OlDa = @Base
WHILE @@FETCH_STATUS = 0
BEGIN
IF @NwDa > DATEADD(s, @Appx, @OlDa)
BEGIN
-- print CAST(@OlDa AS varchar) + ' ' + CAST(@NwDa AS varchar) + ' mantieni ' + CAST((DATEADD(s, @Appx, @OlDa)) AS varchar) + ' ' + CAST(@Idxx AS varchar)
SET @OlDa = @NwDa
END
ELSE
BEGIN
-- print CAST(@OlDa AS varchar) + ' ' + CAST(@NwDa AS varchar) + ' elimina ' + CAST((DATEADD(s, @Appx, @OlDa)) AS varchar) + ' ' + CAST(@Idxx AS varchar)
DELETE FROM #T1 WHERE Id=@Idxx
END
FETCH NEXT FROM Curs INTO @Idxx, @NwDa
END
CLOSE Curs
DEALLOCATE Curs
-- xx Fine della procedura xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-- *****************************************************************************************
-- xx mostro i dati dopo la routine xxxxxxxxxxxxxxxxxxxxxx
SELECT [Id], [DaOr], [Note] FROM #T1 ORDER BY [DaOr];
GO
-- xx faccio pulizia nel tempdb xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
DROP TABLE #T1;
GO
-- xx Finito