Confronto date solo su mese e anno

lunedì 07 giugno 2010 - 13.12

cicemoi Profilo | Junior Member

Salve,
ho un problema....vorrei fare un confronto fra delle date presenti sul db e date che io compongo con parametri passati alla stored.
In particolare passo alla stored due interi anno e mese e vorrei filtrare tutti quei record con campi "dataInzio" e "datafine" che comprendono il mese che io ho passato.

per ora ho creato la data del primo e ultimo giorno del mese passato (tipo 2010-06-01 00:00:00 e 2010-06-30 00:00:00) e poi ho fatto:

where
NMS_assegnazioneCentroCosto_TB.assegnazioneCentroCosto_inizio<= convert(datetime, @giorno1,120)
and NMS_assegnazioneCentroCosto_TB.assegnazioneCentroCosto_finePrevista >= convert(datetime,@giornoUltimo,120)

solo ceh in questo modo tutte le date di inizio che però cominciano dopo l'1 e tutte le date che finiscono prima dell'ultimo giorno del mese vengono escluse
ritenete che sia il caso di considerare il primo giorno del mese sulla data inizio e l'ultimo sulla data fine? e come posso implementarlo?

spero di essere stata un pò chiara!

grazie cinzia

lbenaglia Profilo | Guru

>ho un problema....vorrei fare un confronto fra delle date presenti
>sul db e date che io compongo con parametri passati alla stored.

Ciao Cinzia,

Puoi postare un esempio completo con la struttura della tabella (CREATE TABLE), alcune righe di prova (INSERT INTO), il codice della stored procedure (CREATE PROCEDURE), qualche esempio di chiamata della sp con i relativi result set basati sui parametri di input e le righe indicate.

>grazie cinzia
Prego.

Ciao!

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

cicemoi Profilo | Junior Member

questa è la tabella

CREATE TABLE [dbo].[NMS_assegnazioneCentroCosto_TB](
[assegnazioneCentroCosto_ID] [int] IDENTITY(1,1) NOT NULL,
[assegnazioneCentroCosto_inizio] [smalldatetime] NULL,
[assegnazioneCentroCosto_finePrevista] [smalldatetime] NULL,
[assegnazioneCentroCosto_costoStimato] [decimal](18, 2) NULL,
[assegnazioneCentroCosto_ricavoStimato] [decimal](18, 2) NULL,
[assegnazioneCentroCosto_ricavoOrario] [decimal](18, 2) NULL,
[contratto_ID] [int] NULL,
[centroCosto_ID] [int] NULL,
[statoAssegnazioneCentroCosto_ID] [int] NULL,
CONSTRAINT [PK_NMS_assegnazioneCentroCosto_TB] PRIMARY KEY CLUSTERED
(
[assegnazioneCentroCosto_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


questa è la stored dove @anno e @mese sono parametri di input:

declare @giorno1 varchar(20)
declare @giornoUltimo varchar(20)

set @giorno1 = convert(varchar, @anno) + '-' + right('0' + convert(varchar, @mese), 2) + '-01 00:00:00'
set @giornoUltimo = dateadd( d, -1 , dateadd( m , 1 , convert(datetime,@giorno1, 120) ) )

SELECT assegnazioneCentroCosto_inizio,
assegnazioneCentroCosto_finePrevista
from dbo.NMS_assegnazioneCentroCosto_TB
where NMS_assegnazioneCentroCosto_TB.assegnazioneCentroCosto_inizio<= convert(datetime, @giorno1,120)
and NMS_assegnazioneCentroCosto_TB.assegnazioneCentroCosto_finePrevista >= convert(datetime,@giornoUltimo,120)

in questo caso tutte le date inizio che sono maggiori di 1 o le date fine che sono minori dell'ultimo giorno e che sono comunque del mese in questione, vengono scartate!!!!

come posso fare????

lbenaglia Profilo | Guru

>come posso fare????
Postare le altre informazioni che ti ho chiesto

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

cicemoi Profilo | Junior Member

queste sono due insert

INSERT INTO [NMS].[dbo].[NMS_assegnazioneCentroCosto_TB]
([assegnazioneCentroCosto_inizio]
,[assegnazioneCentroCosto_finePrevista]
,[assegnazioneCentroCosto_costoStimato]
,[assegnazioneCentroCosto_ricavoStimato]
,[assegnazioneCentroCosto_ricavoOrario]
,[contratto_ID]
,[centroCosto_ID]
,[statoAssegnazioneCentroCosto_ID])
VALUES
('2010-05-07 11:16:00'
,'2010-08-07 11:16:00'
,null
,null
,null
,1
,1
,0)

INSERT INTO [NMS].[dbo].[NMS_assegnazioneCentroCosto_TB]
([assegnazioneCentroCosto_inizio]
,[assegnazioneCentroCosto_finePrevista]
,[assegnazioneCentroCosto_costoStimato]
,[assegnazioneCentroCosto_ricavoStimato]
,[assegnazioneCentroCosto_ricavoOrario]
,[contratto_ID]
,[centroCosto_ID]
,[statoAssegnazioneCentroCosto_ID])
VALUES
('2010-07-14 11:16:00'
,'2010-10-15 11:16:00'
,null
,null
,null
,1
,1
,0)

questa è la select

--exec Select_CentriCostoUtente 2010, 6
create PROCEDURE [dbo].[Select_CentriCostoUtente]
(
@idUtente int,
@anno int,
@mese int
)
AS
BEGIN

declare @giorno1 varchar(20)
declare @giornoUltimo varchar(20)

set @giorno1 = convert(varchar, @anno) + '-' + right('0' + convert(varchar, @mese), 2) + '-01 00:00:00'
set @giornoUltimo = dateadd( d, -1 , dateadd( m , 1 , convert(datetime,@giorno1, 120) ) )

print @giorno1
print @giornoUltimo

SELECT assegnazioneCentroCosto_inizio,
assegnazioneCentroCosto_finePrevista
from NMS_assegnazioneCentroCosto_TB
where NMS_assegnazioneCentroCosto_TB.assegnazioneCentroCosto_inizio<= convert(datetime, @giorno1,120)
and NMS_assegnazioneCentroCosto_TB.assegnazioneCentroCosto_finePrevista >= convert(datetime,@giornoUltimo,120)

lbenaglia Profilo | Guru

>queste sono due insert
<SNIP>

Ora mancano un paio di chiamate della sp corredate dai parametri di input e del result set atteso.

EXEC dbo.Select_CentriCostoUtente ..., ..., ... /* Output: col1 col2 col_n ----- ----- ... ------ ... */

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

cicemoi Profilo | Junior Member

l'ho scritto sopra il create della stored

exec Select_CentriCostoUtente 2010, 6

con una chiamata del genere mi aspetto che tiri fuori entrambi i record

mettendo invece


exec Select_CentriCostoUtente 2010, 5

dovrebbe tirar fuori solo il primo record......

lbenaglia Profilo | Guru

>l'ho scritto sopra il create della stored
OK, mi era sfuggito

>exec Select_CentriCostoUtente 2010, 6
>
>con una chiamata del genere mi aspetto che tiri fuori entrambi
>i record
>
>mettendo invece
>
>
>exec Select_CentriCostoUtente 2010, 5
>
>dovrebbe tirar fuori solo il primo record......

Mmmmm... è da un po' che ci ragiono ma non riesco a capire la logica che sta dietro a questi risultati.
Mi puoi dare una mano?

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

cicemoi Profilo | Junior Member

ho fatto in questo modo e funziona FINALMENTE

convert(datetime, convert(varchar(4),year(NMS_assegnazioneCentroCosto_TB.assegnazioneCentroCosto_inizio)) + '-' +
right('0' + convert(varchar(2),month(NMS_assegnazioneCentroCosto_TB.assegnazioneCentroCosto_inizio)),2) + '-01 00:00:00',120)
<= convert(datetime, @giorno1,120)

and dateadd( d, -1, CONVERT(datetime, convert(varchar(4),year(NMS_assegnazioneCentroCosto_TB.assegnazioneCentroCosto_finePrevista)) + '-' +
RIGHT('0' + convert(varchar(2),month(dateadd(m ,1 ,NMS_assegnazioneCentroCosto_TB.assegnazioneCentroCosto_finePrevista))),2) + '-01 00:00:00' ,120))
>= convert(datetime,@giornoUltimo,120)

effettivamente è un pò contorto da spiegare......grazie mille lo stesso
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