Differenza di date

giovedì 10 agosto 2006 - 17.01

bluland Profilo | Guru

salve,

ho due date in un db sql server vorrei che all'inserimento della seconda, in un altro campo mi venisse inserita la differenza delle due date.

idee?

saluti


ENzo

micto27 Profilo | Senior Member

>salve,
>
>ho due date in un db sql server vorrei che all'inserimento della
>seconda, in un altro campo mi venisse inserita la differenza
>delle due date.
>
>idee?
>
>saluti

SQL Server ha la funzione "DATEDIFF ( datepart , startdate , enddate )"

Se tale differenza deve essere fisicamente registrata sul database potresti definire un trigger
da attivare a fronte di INSERT e UPDATE con il quale valorizzare la colonna target
con il risultato della funzione DATEDIFF.
Diversamente, senza registrare la differenza, potresti calcolarla direttamente nell'ambito dello statement sql dove ti serve:

select Data1, Data2, DATEDIFF( ?? , Data1 , Data2 ) as Differenza,..... from .....

Ciao, Michele

bluland Profilo | Guru

si ho visto datediff ma ho riscontrato un problema o almeno credo, poiche questa funzione mi fa la differenza solo per un parametro che sia minuti, ore, secondi ecc.

esempio:

Data_In Data_Out

2006-07-25 14:49:57.623 2006-07-25 15:59:57.343
2006-07-25 15:59:58.323 2006-07-25 16:03:57.343



select DATEDIFF(MINUTE, Data_In, Data_Out) from miatabella


Risultato

70
4
e se io lo volessi nella forma : 01:10, 00:04 ??

come potrei fare?? un CAST??

micto27 Profilo | Senior Member

>si ho visto datediff ma ho riscontrato un problema o almeno credo,
>poiche questa funzione mi fa la differenza solo per un parametro
>che sia minuti, ore, secondi ecc.
>
>esempio:
>
>Data_In Data_Out
>
>2006-07-25 14:49:57.623 2006-07-25 15:59:57.343
>2006-07-25 15:59:58.323 2006-07-25 16:03:57.343
>
>
>
>select DATEDIFF(MINUTE, Data_In, Data_Out) from miatabella
>
>
>Risultato
>
>70
>4
>e se io lo volessi nella forma : 01:10, 00:04 ??
>
>come potrei fare?? un CAST??
>

Ciao,
se l'intervallo da misurare fosse inferiore alle 24 ore un'idea può essere questa,
ti passo uno script T-SQL, prova a verificarlo, tanto per valutare l'idea:

declare @oggi datetime

set @oggi = convert(datetime, convert(varchar, getdate(), 103), 103)

declare @d1 datetime
declare @d2 datetime

set @d1 = convert(datetime, '2006-08-11 10:21:33', 120)
set @d2 = convert(datetime, '2006-08-11 10:24:51', 120)

select convert(varchar, dateadd(ss, datediff(ss, @d1, @d2), @oggi), 108)

L'idea è questa:
uso datediff per ottenere una differenza in secondi
sommo tale numero di secondi a un datatime che abbia la parte TIME = 00:00:00 in modo da ottenere un campo datetime
formattando il datetime ottenuto per la parte HH:mm:ss ottengo quello che ti serviva

Ciao, Michele

bluland Profilo | Guru

LO vedo e ti faccio sapere grazie

bluland Profilo | Guru

FUNZIONA benissimo, il problema ora e' che devo inserire di default il valore 00:00:00.000, in ogni record del TRANSIT_Time, ed inoltre, devo creare un TRIGGER che al momento che mi viene fatto l"UPDATE di uno specifico record mi riempe il campo
TRANSIT_Time facendo la differenza dei due tempi??

tu che ne pensi??


ps. ma anche tu niente vacanze?

micto27 Profilo | Senior Member

>FUNZIONA benissimo, il problema ora e' che devo inserire di default
>il valore 00:00:00.000, in ogni record del TRANSIT_Time, ed inoltre,
>devo creare un TRIGGER che al momento che mi viene fatto l"UPDATE
>di uno specifico record mi riempe il campo
>TRANSIT_Time facendo la differenza dei due tempi??
>
>tu che ne pensi??
>
>
>ps. ma anche tu niente vacanze?

Ma non è che della colonna TRANSIT_Time puoi fare a meno?
Potresti definirti una User Defined Function che quello che abbiamo visto nello script e che utilizzi negli statement
SQL:

select col1, col2, data1, data2, fnTransitTime(Data1, Data2) ......

Michele

bluland Profilo | Guru

No perche' cmq il tempo di transit deve essere memorizzato!!

cmq ho appena scoperto che sono neccessari anche i giorni, cmq ho risolto mettendo giorni e ore in due colonne diverse cosi:


SELECT
DATEDIFF(DAY,'2006-07-24 15:59:58.323','2006-07-26 16:03:57.343')
AS Transit_Days,
CONVERT(VARCHAR,DATEADD(MINUTE,DATEDIFF(MINUTE,'2006-07-24 16:59:58.323','2006-07-26 17:05:57.343'),''),108)
AS Transit_hour

al limite prevedero' una query di UPDATE dove per i due campi inseriro' le espressioni sopra!
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5