1 messaggio dal 22 aprile 2020
Buongiorno a tutti volevo sapere se potete aiutarmi con il filtro per i dati in uscita da una query, praticamente, dalla query, carico un report e tutti ricorda hanno un data (riportata fino al secondo di registrazione del record), un id e un nome operazione.

Il problema è che dando un parametro in entrata di X secondi, si dovrebbero prendere tutti i record di quell'intervallo di secondi ed estrarne solo il più vecchio, come posso impostare il filtro?
Nel caso un between fra le date fosse sufficiente, come lo imposto per far estrarre solo il record più vecchio di un dato intervallo di secondi?

Grazie a tutti per l'aiuto e buona giornata
1.959 messaggi dal 27 luglio 2005
Contributi
salve,
se ho ben capito, puoi usare una windowing function per avere il riferimento alla riga "piu' nuova" nel timespan indicato...

tu hai n righe che vanno da 2020-04-23 04:59:00 in avanti per n secondi e vuoi avere la "piu' nuova" nell'intervallo tra '2020-04-23 00:05:00' + 1 secondo...
con la windowing function ottieni il rownumber nella window, e con questo riferimento e la chiave primaria puoi referenziare la riga a te interessante...
trivialmente,

SET NOCOUNT ON;
USE tempdb;
CREATE TABLE [dbo].[t] (
Id int NOT NULL PRIMARY KEY,
Opertion varchar(5) NOT NULL DEFAULT 'op',
dt datetime NOT NULL
);
INSERT INTO [dbo].[t]
VALUES ( 1, '1', '2020-04-23 00:05:01'), ( 2, '2', '2020-04-23 00:04:59'), ( 3, '3', '2020-04-23 00:05:00'), ( 4, '4', '2020-04-23 00:05:02'), ( 5, '5', '2020-04-23 00:03:01');
GO
DECLARE @dt datetime = '2020-04-23 00:05:00';
DECLARE @span int = 1;/*'1 secondo di span' */

PRINT ' tutte le righe comprese nel time span';
SELECT *
FROM [dbo].[t] t
WHERE t.[dt] >= @dt
AND DATEDIFF(SECOND, @dt, t.[dt]) <= @span;

PRINT 'ricerca della riga piu'' "nuova" nel timespan';
WITH cte AS (
SELECT t.[Id], ROW_NUMBER() OVER (ORDER BY t.[dt] DESC) AS [[rn]
FROM [dbo].[t] t
WHERE t.[dt] >= @dt
AND DATEDIFF(SECOND, @dt, t.[dt]) <= @span
)
SELECT t.*
FROM dbo.[t]
JOIN cte c ON c.[Id] = t.[Id]
AND c.[[rn] = 1;
GO
DROP TABLE [dbo].[t];
--<------------
tutte le righe comprese nel time span
Id Opertion dt
----------- -------- -----------------------
1 1 2020-04-23 00:05:01.000
4 4 2020-04-23 00:05:02.000

ricerca della riga piu' "nuova" nel timespan
Id Opertion dt
----------- -------- -----------------------
4 4 2020-04-23 00:05:02.000


salutoni
--
Andrea
Modificato da Andrea Montanari il 23 aprile 2020 00:22 -

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.

Community

In primo piano

I più letti di oggi

In evidenza

Misc