PDA

Visualizza la versione completa : Intervallo di date non funzionante Sql Server 2008


sanfra1976
25-10-2009, 09:25
Salve, ho un probelma ho una tabella che ha i seguenti campi




CREATE TABLE [dbo].[Storico](
[Id_Storico] [int] IDENTITY(1,1) NOT NULL,
[DataInizio] [date] NOT NULL,
[DataFine] [date] NOT NULL,
[Note] [text] NOT NULL,
[utente] [nvarchar](50) NOT NULL,
[causale] [int] NOT NULL,
[abilitato] [bit] NOT NULL,
CONSTRAINT [PK_Storico_1] PRIMARY KEY CLUSTERED
(
[Id_Storico] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

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


codice:

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.

Ho provato a mettere dei valori varchar come parametri nella stored procedure e poi fargli un cast di tipo ISO ma nulla.
Qualcuno ha un idea?
Sono un pò disperato a capire il perchè!


Grazie

sanfra1976
25-10-2009, 12:37
Nessuno mi può dare una risposta?

oregon
25-10-2009, 12:43
Beh ... il 01/09/2009 non e' >= del 01/10/2009 quindi il comportamento del DBMS mi sembra corretto ...

sanfra1976
25-10-2009, 14:08
Innanzitutto grazie per il tuo intervento tempestivo,
Si hai perfettamente ragione e quindi stavo pensando di fare in modo che la datainiziale sia compresa nell'intervallo anche "@data_in<=datainiziale" e quindi la stored diventerebbe 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_in <= s.DataInizio)
AND(@data_fin <= s.DataFine and @data_fin>= s.DataFine)
AND s.causale=@causale

ma anche così non sembra piacergli.


Potresti darmi un suggerimento anche un link!

oregon
25-10-2009, 14:22
Non mi pare che tutte quelle condizioni (AND) possano essere contemporaneamente verificate.

Per dare una risposta coerente, fai degli esempi di cosa vuoi ottenere, con delle date in concreto ...

sanfra1976
25-10-2009, 14:47
Certamente, la tabella conerrà questi possibili valori:



2 01/10/2009 0.00.00 31/10/2009 0.00.00 prova pippo 38 True
3 01/11/2009 0.00.00 30/11/2009 0.00.00 prova1 poldo 37 False
4 01/10/2009 0.00.00 31/10/2009 0.00.00 prova2 pedro 37 True
5 01/12/2009 0.00.00 31/12/2009 0.00.00 prova3 pippone 45 False

la select che sto cercando di sviluppare mi deve tornare(una scelta personale)l'Id di quest'ultima nel caso ci sia la sequenza esatta della data iniziale e della data finale con la relativa causale.

però vorrei anche, che se metto un range di date e in questo range di date ci fosse un perido(tra la data iniziale e la data finale) me lo segnalasse come record esistente.

Es:
DataIniziale:01/09/2009 - DataFinale 31/10/2009 causale 38

mi dovrebbe dire che il record esiste già
come dovrebbe dirmelo anche se
la situazione sarebbe la seguente:

Es.DataIniziale:01/10/2009 - DataFinale:31/10/2009 causale 38

oppure ancora
Es. DataIniziale 01/10/2009 - DataFinale:30/11/2009 causale 38
oppure con le stesse date ma con causale 37 perchè nei record di esempi che ho inserito c'è anche il periodo che va dal 01/11/2009 al 30/11/2009 con causale 37

Spero di essere stato chiaro e spero che mi potrai dare una mano!

Grazieancora

Loading