Trovare valori confrontando dei valori di tipo data

venerdì 23 ottobre 2009 - 10.49

sanfra Profilo | Junior Member

Salve, ho un probelma ho una tabella che ha i seguenti campi
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Da questa tabella devo controllare se esiste un record in un range di date con una specifica causale
quindi io ho fatto la query così:
ALTER PROCEDURE [dbo].[ExistStorico_1](@data_in datetime,@data_fin datetime,@causale int) AS BEGIN select Id_Storico from Storico s where @data_in >= s.DataInizio AND @data_fin <= s.DataFine AND s.causale=@causale

Il punto è che se io ho nella tabella questi valori
DataInizio=01/10/2009
DataFine=31/10/2009
Causale=pippo

e vado a inserire una data che va dal 01/09/2009 al 31/10/2009 e con la stessa causale mi deve dire che il periodo è già occupato.

Qualcuno ha un idea?

Grazie

alx_81 Profilo | Guru

>Salve,
ciao

>e vado a inserire una data che va dal 01/09/2009 al 31/10/2009
>e con la stessa causale mi deve dire che il periodo è già occupato.
>Qualcuno ha un idea?
puoi usare la EXISTS(). Una cosa tipo:

IF NOT EXISTS(la tua select di controllo)
INSERT
ELSE
Errore

>Grazie
di nulla!

--

Alessandro Alpi | SQL Server MVP

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

sanfra Profilo | Junior Member

Forse non mi sono spiegato bene, il punto è che non mi vede il periodo tra le date che io vado a controllare, cioè se metto 01/10/2009 e 31/01/2009 mi dice che esistema se metto 01/09/2009 e 31/10/2009 mi dice che non esiste,mentre dovrebbe dirmelo.

Spero di essere stato chiaro!

alx_81 Profilo | Guru

>Forse non mi sono spiegato bene, il punto è che non mi vede il
>periodo tra le date che io vado a controllare, cioè se metto
>01/10/2009 e 31/01/2009 mi dice che esistema se metto 01/09/2009
>e 31/10/2009 mi dice che non esiste,mentre dovrebbe dirmelo.
ma i dati al parametro come li passi? se sono variabili tipizzate non hai problemi, se invece le vuoi passare da una stringa tua, usa il formato ISO SSAAMMGG HH:mm:ss.nnn.
'20090131 00:00' ad esempio..

--

Alessandro Alpi | SQL Server MVP

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

sanfra Profilo | Junior Member

Li passo come valori DateTime come gli altri e infatti mi funziona correttamente, tranne il fatto che non vede un range di date più grande o più piccolo delle date inserite nel db

lbenaglia Profilo | Guru

>Li passo come valori DateTime come gli altri e infatti mi funziona
>correttamente, tranne il fatto che non vede un range di date
>più grande o più piccolo delle date inserite nel db

Occhio che le colonne sono definite come Date mentre i parametri sono Datetime.
Questo non causa il problema che esponi, ma sicuramente ha poco senso utilizzare data type differenti.

Puoi postare un esempio completo con la CREATE TABLE, alcune righe di prova (INSERT INTO), la valorizzazione dei 2 parametri ed il risultato che ti aspetteresti con quei dati?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

sanfra Profilo | Junior Member

Grazie per il tuo intervento, si devo sistemare i valori che gli passo come parametri.
non ho ben capito quando mi chiedi un esempio con la Create Table,

per quanto riguarda l'insert di esempio queste possono bastare?

insert into Storico(DataInizio,DataFine,Note,utente,causale,abilitato)VALUES('2009-11-01','2009-11-30','prova','pippo',38,0)
insert into Storico(DataInizio,DataFine,Note,utente,causale,abilitato)VALUES('2009-10-01','2009-10-31','prova1','pluto',37,1)


il risultato che mi aspetto è per esempio, che non mi deve fare inserire un valore con datainiziale: 2009-09-09 e datafinale:2009-10-31 con causale = 37 perchè esiste un perido nella tabella che racchiude in parte il perido che io ho digitato nell'esempio precedente.

Spero di aver detto tutto quello che ti poteva essere utile.

Grazie per il tuo intervento!

sanfra Profilo | Junior Member

Nessuno mi può aiutare a capire?


Grazie ancora

alx_81 Profilo | Guru

>Nessuno mi può aiutare a capire?
continuo a sostenere che basta fare una stored procedure che controlla con una EXISTS se esiste già un record che soddisfa quei requisiti. In caso negativo inserisco.
--

Alessandro Alpi | SQL Server MVP

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

sanfra Profilo | Junior Member

Ho voluto provare quello che tu mi dici e ho fatto questa semplice prova:
IF EXISTS(select Id_Storico from Storico s where @data_in >= s.DataInizio AND @data_fin <= s.DataFine AND s.causale=@causale) BEGIN return 1 END else BEGIN return -1 END

nonostante gli passi i parametri datainiziale 01/09/2009 datafinale 31/10/2009 con causale 37 mi ritorna -1
e nel database c'è la seguente tupla
72 2009-10-01 2009-10-31 hjghjghjghj Paolo_82 37 False

Sto ancora sbagliando qualcosa?

Grazie

alx_81 Profilo | Guru

>nonostante gli passi i parametri datainiziale 01/09/2009 datafinale
>31/10/2009 con causale 37 mi ritorna -1
>e nel database c'è la seguente tupla
>72 2009-10-01 2009-10-31 hjghjghjghj Paolo_82 37 False
>
>Sto ancora sbagliando qualcosa?
Chi chiama questa stored? Come? Ado.net? Da script sql di prova? Puoi passarmi la chiamata?

--

Alessandro Alpi | SQL Server MVP

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

sanfra Profilo | Junior Member

in questo caso ho provato a farla con sql server 2008 express edition tasto destro execute store procedure

e gli ho passato questi valori:
USE [] GO DECLARE @return_value int EXEC @return_value = [dbo].[ExistStorico_1] @data_in = N'01/09/2009', @data_fin = N'31/10/2009', @causale = 37 SELECT 'Return Value' = @return_value GO

alx_81 Profilo | Guru

>in questo caso ho provato a farla con sql server 2008 express
>edition tasto destro execute store procedure
prova ad usare la forma che ti ho detto prima (ISO):

DECLARE @return_value int EXEC @return_value = [dbo].[ExistStorico_1] @data_in = N'20090901', @data_fin = N'20091031', @causale = 37 SELECT 'Return Value' = @return_value GO

--

Alessandro Alpi | SQL Server MVP

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

sanfra Profilo | Junior Member

Ciao ho voluto prednere in considerazione il tuo suggerimento e quindi ho svolto il seguente compito:
mi sono ricreato la tabella
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ho inserito dei nuovi record di prova(naturalmente):
1 2009-11-01 2009-11-30 prova pippo 38 False 2 2009-10-01 2009-10-31 prova1 pluto 37 True 5 2009-12-01 2009-12-31 prova pippo 38 False 6 2009-10-01 2009-10-31 prova1 pluto 45 True

infine ho voluto eseguire la stored procedure con lo sxtesso sistema mostrato in precedenza:
però mi dà l'errore "Errore di overflow aritmetico durante la conversione di expression nel tipo di dati datetime"

Sto procedendo correttamente secondo il tuo suggerimento?

Grazie

alx_81 Profilo | Guru

>Sto procedendo correttamente secondo il tuo suggerimento?
no, il data type della tabella DEVE essere datetime. Poi l'applicazione o qualunque cosa si interfacci a quella tabella deve avere lo stesso datatype. Ad esempio, se hai un'applicazione in .net che chiama una stored procedure che scrive in quella tabella, devi fare DateTime i parametri sulla parte .net, passarli come SQLDateTime in ADO.Net e definire i parametri della stored procedure DateTime. La stringa serve solo se sei tu a mano che devi richiamare a titolo di prova una stored procedure che ha i parametri in formato DateTime. Oppure, ci sono casi speciali in cui la data che ti arriva da passare non è gestita direttamente da te e quindi ti arriva incondizionatamente una stringa.
Se passi da stringa usa il formato ISO SSAAMMGG HH:mm:ss.nnn, senza i meno, ma se devi passare le date da un'ipotetica applicazione, devi usare i corretti data type, ed, in questo caso, DateTime. Fai attenzione che le impostazioni di data ed ora degli eventuali server che si parlano (ad esempio web, application e db server) devono essere le stesse.

>Grazie
di nulla!
--

Alessandro Alpi | SQL Server MVP

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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5