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/
Così dovrebbe andare:
SELECT data_fine = CASE attivo
WHEN 'false' Then DATEADD(day, -1, data_inizio)
ELSE '01/01/1900
FROM nometabella
Nicola
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
> 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
>
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
--
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/
> La query va benissimo. Grazie
> Nel caso volessi fare un update? Nel senso...se volessi
> che datafinecalcolata venisse inserita in Data_fine in t2?
>
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