Differenza di date

giovedì 10 agosto 2006 - 17.03

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

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??

lbenaglia Profilo | Guru

>e se io lo volessi nella forma : 01:10, 00:04 ??
>
>come potrei fare?? un CAST??

I datatype datetime e smalldatetime contengono sia l'informazione data che l'informazione oraria, ma con validità e precisione differenti:

datetime
--------
Range di validità: 1 gennaio 1753 - 31 dicembre 9999 con una precisione pari a 0.00333 secondi.
Bytes occupati: 8 (2 coppie di interi di 4 bytes)
- i primi 4 per la memorizzazione dei giorni prima o dopo l'1 gennaio 1900
- gli altri 4 per la memorizzazione dei millisecondi dopo la mezzanotte

smalldatetime
-------------
Range di validità: 1 gennaio 1900 - 6 giugno 2079 con una precisione al minuto.
Bytes occupati: 4 (2 coppie di interi di 2 bytes)
- i primi 2 per la memorizzazione dei giorni dopo l'1 gennaio 1900
- gli altri 2 per la memorizzazione dei minuti dopo la mezzanotte

Come vedi le date sono memorizzate internamente come 2 coppie di interi.
Quella che tu vedi "nel db" non è altro che una formattazione di questi interi effettuata dal client.

Quindi, dato che in sostanza parliamo di numeri interi è possibile sommare e sottrarre date utilizzando gli operatoti "+" e "-". Tramite la funzione CONVERT è possibile formattare il risultato come più ci aggrada:

USE tempdb; GO CREATE TABLE dbo.Dates( Data_In datetime NOT NULL, Data_Out datetime NOT NULL ); GO INSERT dbo.Dates VALUES('20060725 14:49:57.623', '20060725 15:59:57.343'); INSERT dbo.Dates VALUES('20060725 15:59:58.323', '20060725 16:03:57.343'); GO SELECT Data_Out - Data_In AS DateDifference , CONVERT(char(12), Data_Out - Data_In, 114) AS DateDifferenceFormatted FROM dbo.Dates; GO /* Output: DateDifference DateDifferenceFormatted ------------------------ ----------------------- 1900-01-01 01:09:59.720 01:09:59:720 1900-01-01 00:03:59.020 00:03:59:020 (2 row(s) affected) */ DROP TABLE dbo.Dates;

Per maggiori dettagli leggi il seguente paragrafo dei Books Online:

"CAST and CONVERT"
http://msdn.microsoft.com/library/en-us/tsqlref/ts_ca-co_2f3o.asp

Ciao!

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

bluland Profilo | Guru

Uh grazie ottima soluzione io c'ero arrivato ma usando Datediff e dateadd facendo una cosa + articolata , ma se volessi mettere anche i giorni di differenza come mi converrebbe fare per avere una soluzione pulita?
ho pensato di mettere la differenza giorni in un altro campo magari usando proprio un datediff tu che ne dici?

saluti
ENzo

lbenaglia Profilo | Guru

>se volessi mettere anche i giorni di differenza come mi converrebbe fare per avere
>una soluzione pulita?
>ho pensato di mettere la differenza giorni in un altro campo
>magari usando proprio un datediff tu che ne dici?

Il risultato di una differenza tra due colonne datetime è sempre una data, pertanto avrai sia l'informazione data che quella tempo.
Se queste informazioni ti servono separate utilizza pure due colonne.

Ciao!

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

bluland Profilo | Guru

veramente a me non serve in un altro campo il giorno ma come funzionerebbe se volessi metterlo nello stesso campo?

se provo:

USE tempdb; GO CREATE TABLE dbo.Dates( Data_In datetime NOT NULL, Data_Out datetime NOT NULL ); GO INSERT dbo.Dates VALUES('20060803 14:49:57.623', '20060804 15:59:57.343'); INSERT dbo.Dates VALUES('20060803 15:59:58.323', '20060805 16:03:57.343'); GO SELECT CONVERT(char(24), Data_Out - Data_In, 113) AS DateDifferenceFormatted FROM dbo.Dates; GO /* Output: DateDifferenceFormatted ----------------------- 02 Jan 1900 01:09:59:720 03 Jan 1900 00:03:59:020 (2 row(s) affected) */ DROP TABLE dbo.Dates;

non va bene poiche a me servirebbe solo il giorno ed inoltre inizia a contare dal 1900, come dovrei modificare la query?

grazie ancora

lbenaglia Profilo | Guru

>non va bene poiche a me servirebbe solo il giorno ed inoltre
>inizia a contare dal 1900, come dovrei modificare la query?

Non puoi memorizzare solo il giorno e l'ora, ma devi memorizzare la data e l'ora completa.
Ovviamente inizia a contare dal 01 gennaio 1900 perché stai sottraendo 2 date con stesso anno e stesso mese. Se anche il giorno coincide otterrai appunto la data base del 01 gennaio 1900 che corrisponde a 0 nel primo intero del data type datetime.
Per i tuoi scopi utilizza pure 2 colonne.

>grazie ancora
Prego.

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

bluland Profilo | Guru

Grazie sempre disponibilissimo
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