Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[OT] Stored procedure T-SQL

0 views
Skip to first unread message

Pianto Tardivo

unread,
Jul 22, 2008, 5:02:31 AM7/22/08
to
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/

Nicola Ottomano

unread,
Jul 22, 2008, 6:59:16 AM7/22/08
to
Pianto Tardivo ha scritto:

> 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.

Così dovrebbe andare:

SELECT data_fine = CASE attivo
WHEN 'false' Then DATEADD(day, -1, data_inizio)
ELSE '01/01/1900
FROM nometabella


Nicola

Andrea Montanari

unread,
Jul 22, 2008, 11:10:54 AM7/22/08
to
salve,

Pianto Tardivo wrote:
> 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.

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


Paolo opg

unread,
Jul 22, 2008, 11:33:18 AM7/22/08
to
"Pianto Tardivo" <a...@aaa.it> wrote in
news:op.ueore...@giacomo.residential.fw:

> 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
--

PiantoTardivo

unread,
Jul 23, 2008, 5:53:09 AM7/23/08
to
Il 22 Lug 2008, 17:10, "Andrea Montanari" <andrea...@virgilio.it> 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/

Andrea Montanari

unread,
Jul 23, 2008, 11:59:25 AM7/23/08
to
salve Giacomo,
PiantoTardivo wrote:

> 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

0 new messages