Ciclare con data inizio e data fine

giovedì 03 aprile 2008 - 00.26

squilibrio Profilo | Expert

Ciao a tutti ho una SP che tra le altre cose esegue una insert

esiste un modo per eseguire (in una stored procedure) un ciclo del tipo

partendo da

datainizio
datafine

eseguire l'insert da data inizio a data fine passando la data all'insert

INSERT INTO Agenda (data, descrizione, title)....


sto facendo alcune prove, la mia SP è


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[UpdateProgettoFase]
(
@IDProgetto int,
@IDProgettoFase int,
@Ordine int,
@OrdineSub varchar(1),
@Certa bit,
@Calendario bit,
@DataDa DateTime,
@DataA DateTime,
@DataIncasso DateTime,
....
)
AS


DECLARE @Cliente varchar(255)

...

UPDATE
ProgettiFasi
SET
IDProgetto=@IDProgetto,
Ordine=@Ordine,
OrdineSub=@OrdineSub,
Certa=@Certa,
Calendario=@Calendario,
DataDa=@DataDa,
DataA=@DataA,
....
WHERE (IDProgettoFase=@IDProgettoFase)


-- Viene cancellata l'eventuale fase già presente
DELETE FROM Agenda
WHERE (IDProgettoFase = @IDProgettoFase)

IF (@Calendario = 1)
BEGIN


DECLARE @currentDate AS datetime
SET @currentDate = @DataDa

WHILE @currentDate <= @DataA
BEGIN

IF (@Certa = 1)
BEGIN
INSERT INTO Agenda (IDCollaboratore, startDate, endDate, title, backColor, borderColor, textColor, locked, IDProgettoFase)
SELECT IDCollaboratore,@currentDate + (@DataDa - DATEADD(dd, 0, DATEDIFF(dd, 0, @DataDa))),@currentDate + (@DataA - DATEADD(dd, 0, DATEDIFF(dd, 0, @DataA))),@Cliente + ' - ' + @DescrizioneFase,'Lime','Yellow','Black',@Certa,@IDProgettoFase FROM ProgettiFasiCollaboratori WHERE IDProgettoFase = @IDProgettoFase
END


.....


ho inserito

@currentDate + (@DataDa - DATEADD(dd, 0, DATEDIFF(dd, 0, @DataDa))),@currentDate + (@DataA - DATEADD(dd, 0, DATEDIFF(dd, 0, @DataA)))


ma sembrano esserci problemi...

DataDa e DataA che passo hanno come "ora da" 8.00 e "ora a" 19.00

ma la data generata ha "ora da" 16.00 e "ora a" 3.00 (tra l'altro nel giorno successivo)


Cosa sbaglio??


con data inizio 27/02/2008 8.00.00 e data fine 29/02/2008 19.00.00

mi crea questi insert

27/02/2008 16.00.00 28/02/2008 3.00.00
28/02/2008 16.00.00 29/02/2008 3.00.00
29/02/2008 16.00.00 01/03/2008 3.00.00



con data inizio 20/03/2008 9.00.00 e data fine 21/03/2008 19.00.00

mi crea questi insert

20/03/2008 18.00.00 21/03/2008 4.00.00
21/03/2008 18.00.00 22/03/2008 4.00.00



con data inizio 20/03/2008 13.00.00 e data fine 21/03/2008 15.00.00

mi crea questi insert

21/03/2008 2.00.00 21/03/2008 4.00.00
22/03/2008 2.00.00 22/03/2008 4.00.00


miiiiistero!!!


Grazie ancora!!!

speedx Profilo | Junior Member

Per ciclare sulle date e lanciare la stored potresti utilizzare i cursori , ma non è per nulla performante.
Non conosco il progetto ma valuterei se è necessario farlo in quel modo... potrebbe non essere la soluzione corretta.

Una CTE ovvero una funzione ricorsiva potrebbe fare al caso tuo...

Per quanto riguarda l'orario non ho ben capito se ti serve o no l'ora... ma per creare tutte le date tra DA e A ci sono funzioni in rete
dai un' occhiata
//// Marcello C.

alx_81 Profilo | Guru

>Ciao a tutti
Ciao!

>partendo da
>datainizio
>datafine
>eseguire l'insert da data inizio a data fine passando la data
>all'insert
Lasciando perdere per ora il codice che ci hai passato, quale deve essere il passo tra una data e l'altra? vuoi aggiungere un'ora ad ogni ciclo?
Dobbiamo intanto capire se è veramente necessario ciclare o se si può intervenire in altri modi.

>Grazie ancora!!!
Di nulla!

@Speed-X
>Per ciclare sulle date e lanciare la stored potresti utilizzare i cursori , ma non è per nulla performante.
Usare un ciclo while è corretto, non è necessario un cursore. Sono da evitare quasi sempre, lasciando spazio alla logica SET BASED. Come dici correttamente tu, intendere i calcoli su database con cursori è tutt'altro che performante. Personalmente non li ritengo nemmeno l'ultima spiaggia


Alx81 =)

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

squilibrio Profilo | Expert

Prima di tutto ringrazio, scusate ma sono ancora in ballo...

mi va bene qualunque soluzione, l'importante sarebbe arrivarne a capo...

devo ciclare in quanto devo creare X record uno per ogni giorno

quindi passo due date

DateDa (DateTime)
DataA (DateTime)

io devo

creare X giorni per tutto il periodo che va da DataDa a DataA

estrapolare l'ora ed aggiungere OraDa e OraA per ogni record che creo

in sintesi

ogni record avrà un giorno diverso
ogni record avrà la stessa ora (OraDa OraA)


DECLARE @currentDate AS datetime

SET @currentDate = @DataDa

WHILE @currentDate < @DataA -- il test diventa per minore (tolto "="

BEGIN

INSERT INTO Agenda (IDCollaboratore, startDate, endDate, title) VALUES(@IDCollaboratore,@currentDate,@currentDate,@DescrizioneFase)

SET @currentDate = DATEADD(dd, 1, @currentDate)

END


con questa soluzione funziona ma si incasina con l'ora ... in VisualStudio (in debug mode) passo una data DateTime con il valore dell'ora corretto ma nel DB mi viene salvata la data con un valore sballato

ad esempio:

ho provato ad inserire una data con orario dalle 13 alle 15
e questa viene salvata nel DB con orario dalle 2 alle 4

altr prove...

con data inizio 27/02/2008 8.00.00 e data fine 29/02/2008 19.00.00

mi crea questi insert

27/02/2008 16.00.00 28/02/2008 3.00.00
28/02/2008 16.00.00 29/02/2008 3.00.00
29/02/2008 16.00.00 01/03/2008 3.00.00



con data inizio 20/03/2008 9.00.00 e data fine 21/03/2008 19.00.00

mi crea questi insert

20/03/2008 18.00.00 21/03/2008 4.00.00
21/03/2008 18.00.00 22/03/2008 4.00.00



con data inizio 20/03/2008 13.00.00 e data fine 21/03/2008 15.00.00

mi crea questi insert

21/03/2008 2.00.00 21/03/2008 4.00.00
22/03/2008 2.00.00 22/03/2008 4.00.00



Grazie per l'aiuto!

squilibrio Profilo | Expert

Un aiutinooooo please!

alx_81 Profilo | Guru

>Un aiutinooooo please!
Scusami, ma sono a Seattle ..
Allora, prova con questo esempio:

USE tempdb; GO CREATE TABLE tempDates ( Id smallint IDENTITY(1,1) NOT NULL PRIMARY KEY , DataDa smalldatetime , DataA smalldatetime ) DECLARE @DataDa smalldatetime , @DataA smalldatetime , @OraDa smalldatetime , @OraA smalldatetime SET @DataDa = '20080101' SET @DataA = '20081231' WHILE @DataDa <= @DataA BEGIN SET @OraDa = @DataDa + ' 08:00' SET @OraA = @DataDa + ' 19:00' INSERT INTO tempDates (DataDa, DataA) VALUES (@OraDa, @OraA) SET @DataDa = DATEADD(day, 1, @DataDa) END SELECT * FROM tempDates -- pulizia DROP TABLE tempDates GO

Alx81 =)

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5