Newsgroup: it.comp.lang.visual-basic
Titolo: [OT] Stored procedure T-SQL

Ciao a tutti,
so di essere ot ma qui sono sicuro di trovare gente competente...
Ho questo problema
Tabella con queste colonne e con questi dati di esempio
data_inizio    data_fine    attivo
01/01/2006	             false
23/04/2007	             false
12/01/2008                   true
vorrei creare una stored procedure che mi calcoli la data_fine dei record  
che
sono in attivo=false. La data_fine è uguale alla data_inizio del record  
successivo meno un giorno.
Qualcuno ha qualche idea???
Grazie mille
Piantotardivo		
-- 
Using Opera's revolutionary e-mail client: 
http://www.opera.com/mail/

 successivo meno un giorno.
Così dovrebbe andare:
SELECT data_fine = CASE attivo
	WHEN 'false' Then DATEADD(day, -1, data_inizio)
	ELSE '01/01/1900
FROM nometabella
Nicola

 record successivo meno un giorno.
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.t (
 Id int NOT NULL,
 Data_Inizio datetime NOT NULL,
 Data_Fine datetime NULL,
 Attivo bit NOT NULL
 );
GO
INSERT INTO dbo.t VALUES ( 1, '20060101', NULL, 0 );
INSERT INTO dbo.t VALUES ( 1, '20070423', NULL, 0 );
INSERT INTO dbo.t VALUES ( 1, '20080112', NULL, 1 );
INSERT INTO dbo.t VALUES ( 2, '20060131', NULL, 0 );
INSERT INTO dbo.t VALUES ( 2, '20070503', NULL, 0 );
INSERT INTO dbo.t VALUES ( 2, '20081011', NULL, 1 );
GO
SELECT t.Id, t.Data_Inizio,
 DATEADD( day, -1, (SELECT MIN(t2.Data_Inizio)
  FROM dbo.t t2
  WHERE t2.Id = t.Id
   AND t2.Data_Inizio > t.Data_Inizio))
 AS [DataFineCalcolata]
 FROM dbo.t t
 WHERE t.Attivo = 0
 ORDER BY t.Id, t.Data_Inizio;
GO
DROP TABLE dbo.t;
--<--------
Id          Data_Inizio             DataFineCalcolata
----------- ----------------------- -----------------------
1           2006-01-01 00:00:00.000 2007-04-22 00:00:00.000
1           2007-04-23 00:00:00.000 2008-01-11 00:00:00.000
2           2006-01-31 00:00:00.000 2007-05-02 00:00:00.000
2           2007-05-03 00:00:00.000 2008-10-10 00:00:00.000
saluti
-- 
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz
 
http://www.hotelsole.com
DbaMgr2k ver 0.21.1 - DbaMgr ver 0.65.1 and further SQL Tools
--------- remove DMO to reply 

 
devi aggiornare il contenuto della tabella esistente oppure solo
calcolare e visualizzare la data calcolata? 
-- 
Paolo opg
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

 ha
scritto:

La query va benissimo. Grazie
Nel caso volessi fare un update? Nel senso...se volessi
che datafinecalcolata venisse inserita in Data_fine in t2?
Grazie
Giacomo
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/


SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.t (
 Id int NOT NULL,
 Data_Inizio datetime NOT NULL,
 Data_Fine datetime NULL,
 Attivo bit NOT NULL
);
GO
INSERT INTO dbo.t VALUES ( 1, '20060101', NULL, 0 );
INSERT INTO dbo.t VALUES ( 1, '20070423', NULL, 0 );
INSERT INTO dbo.t VALUES ( 1, '20080112', NULL, 1 );
INSERT INTO dbo.t VALUES ( 2, '20060131', NULL, 0 );
INSERT INTO dbo.t VALUES ( 2, '20070503', NULL, 0 );
INSERT INTO dbo.t VALUES ( 2, '20081011', NULL, 1 );
GO
PRINT 'proiezione';
SELECT t.Id, t.Data_Inizio,
 DATEADD( day, -1, (SELECT MIN(t2.Data_Inizio)
  FROM dbo.t t2
  WHERE t2.Id = t.Id
   AND t2.Data_Inizio > t.Data_Inizio))
  AS [DataFineCalcolata]
 FROM dbo.t t
 WHERE t.Attivo = 0
 ORDER BY t.Id, t.Data_Inizio;
GO
PRINT 'aggiornamento';
UPDATE dbo.t
 SET Data_Fine = (
  SELECT DATEADD( day, -1, (SELECT MIN(t2.Data_Inizio)
   FROM dbo.t t2
   WHERE t2.Id = t.Id
    AND t2.Data_Inizio > t.Data_Inizio))
  )
 WHERE t.Attivo = 0
GO
PRINT 'verifica';
SELECT * FROM dbo.t;
GO
DROP TABLE dbo.t;
--<--------
proiezione
Id          Data_Inizio             DataFineCalcolata
----------- ----------------------- -----------------------
1           2006-01-01 00:00:00.000 2007-04-22 00:00:00.000
1           2007-04-23 00:00:00.000 2008-01-11 00:00:00.000
2           2006-01-31 00:00:00.000 2007-05-02 00:00:00.000
2           2007-05-03 00:00:00.000 2008-10-10 00:00:00.000
aggiornamento
verifica
Id          Data_Inizio             Data_Fine               Attivo
----------- ----------------------- ----------------------- ------
1           2006-01-01 00:00:00.000 2007-04-22 00:00:00.000 0
1           2007-04-23 00:00:00.000 2008-01-11 00:00:00.000 0
1           2008-01-12 00:00:00.000 NULL                    1
2           2006-01-31 00:00:00.000 2007-05-02 00:00:00.000 0
2           2007-05-03 00:00:00.000 2008-10-10 00:00:00.000 0
2           2008-10-11 00:00:00.000 NULL                    1
