Somma Time

venerdì 19 ottobre 2007 - 14.20

ape81 Profilo | Newbie

ciao,

devo convertire un valore DateTime in Integer.
Mi spiego meglio.
Ho costruito una view dove ho due colonne contenenti due date(DateTime).
con questa funzione nella view:

select ......CONVERT(char(24),dbo.EngineerTime.EndTime - dbo.EngineerTime.StartTime, 108) AS DifferTime
from.....
where....

mi ricavo il valore dalla dif tra le due date solo del Time nella colonna DifferTime. (il giorno non mi interessa)
Ora pero' voglio fare una query che mi restituisca la somma dei Time per un certo group by.

Select.....,sum (DifferTime) as ...
from....
where....
group by.....

Cosi' facendo mi restituisce un errore dicendo che il type del dato che gli passo per la somma non e' valido. Devo convertire il Time in integer????? Se si come si fa?

elisa



lbenaglia Profilo | Guru

>Ho costruito una view dove ho due colonne contenenti due date(DateTime).
>con questa funzione nella view:
>
>select ......CONVERT(char(24),dbo.EngineerTime.EndTime - dbo.EngineerTime.StartTime,
>108) AS DifferTime
>from.....
>where....
>
>mi ricavo il valore dalla dif tra le due date solo del Time nella
>colonna DifferTime. (il giorno non mi interessa)

Ciao Elisa,

Dato che la select richiama la funzione CONVERT probabilmente stai utilizzando SQL Server.
Che versione utilizzi?
Quella vista ti serve per altri motivi oppure solo per raggiungere il risultato finale?
Le date nelle due colonne si riferiscono allo stesso giorno? Altrimenti ha poco senso considerare solo l'informazione temporale.

Prova a rispondere a queste domande e vedremo di trovare una soluzione.

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

ape81 Profilo | Newbie


Ciao Elisa,

Dato che la select richiama la funzione CONVERT probabilmente stai utilizzando SQL Server.
Che versione utilizzi?
Quella vista ti serve per altri motivi oppure solo per raggiungere il risultato finale?
Le date nelle due colonne si riferiscono allo stesso giorno? Altrimenti ha poco senso considerare solo l'informazione temporale.

Prova a rispondere a queste domande e vedremo di trovare una soluzione.

Ciao!
--
Lorenzo Benaglia


ciao Lorenzo,
troppo gentile

allora sto utilizzando MSQL Server 2005
la vista mi serve solo per raggiungere il risultato finale, ovvero il totale delle ore per il parametro per cui o fatto group by.
In effetti le date protebbero appartenere a giorni diversi ma a me interessa solamente il valore in termini di tempo....

in pratica ho un parametro:
IssueId

a cui fanno riferimento piu' record

inizio 10/10/2007 12:30:00
fine 10/10/2007 12:59:00

inizio 11/10/2007 12:30:00
fine 11/10/2007 13:30:00

il calcolo della differenza su ogni record viene fatto tra due date di solito dello stesso giorno ma se possibile voglio considerare il caso di giorni diversi.

il codice della View e':

SELECT IssueID, DATEDIFF(hour, dbo.EngineerTime.StartTime, dbo.EngineerTime.EndTime) AS Hour, CONVERT(int,dbo.EngineerTime.EndTime - dbo.EngineerTime.StartTime, 108) AS DifferTime
FROM dbo.EngineerTime INNER JOIN
dbo.Issues ON dbo.EngineerTime.IssueID = dbo.Issues.IssueID INNER JOIN
dbo.Users ON dbo.Issues.AssignedUserID = dbo.Users.UserID
GROUP BY dbo.EngineerTime.IssueID, dbo.EngineerTime.EndTime, dbo.EngineerTime.StartTime, dbo.EngineerTime.UserID

inoltre non ho molto ben chiaro come funziona il group by, perche' voglio raggruppare solo per un parametro(IssueID) ma mi da errore, devo per forza includere anche StartTime ecc..

spero di essere stata abbastanza chiara, aspetto altri dettagli, grazie mille.
elisa





lbenaglia Profilo | Guru

>allora sto utilizzando MSQL Server 2005
OK

>la vista mi serve solo per raggiungere il risultato finale
OK

>In effetti le date protebbero appartenere a giorni diversi ma
>a me interessa solamente il valore in termini di tempo....
Qua non ti seguo.
Aiutami a capire. Supponiamo di avere la coppia di date:

inizio 01/01/2007 12:30:00
fine 10/10/2007 02:06:27

Che senso avrebbe calcolare la differenza tra 02:06:27 - 12:30:00 (che tra l'altro darebbe origine ad una informazione oraria negativa)?

>grazie mille.
Prego.

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

ape81 Profilo | Newbie

>allora sto utilizzando MSQL Server 2005
OK

>la vista mi serve solo per raggiungere il risultato finale
OK

>In effetti le date protebbero appartenere a giorni diversi ma
>a me interessa solamente il valore in termini di tempo....
Qua non ti seguo.
Aiutami a capire. Supponiamo di avere la coppia di date:

inizio 01/01/2007 12:30:00
fine 10/10/2007 02:06:27

Che senso avrebbe calcolare la differenza tra 02:06:27 - 12:30:00 (che tra l'altro darebbe origine ad una informazione oraria negativa)?

>grazie mille.
Prego.

Ciao!

No. Ho scoperto di dover considerare solo un intervallo di tempo in uno stesso giorno.
ovvero devo supporre di avere:

inizio: 10/10/2007 14:00:00
fine: 10/10/2007 15:00:00
IssueID=3
e
inizio: 11/10/2007 12:00:00
fine: 11/10/2007 15:00:00
IssueID=3

io devo ottenere il tempo totale delle ore di lavoro.
io ho pensato di avere una view che mi calcola la differenza tra le due date di ogni intervallo e poi una query che mi faccia la somma del tempo per un group by IssueID.

spero di essere stata un po' piu' chiara.

grazie.
elisa


lbenaglia Profilo | Guru

>No. Ho scoperto di dover considerare solo un intervallo di tempo
>in uno stesso giorno.
>ovvero devo supporre di avere:
>
>inizio: 10/10/2007 14:00:00
>fine: 10/10/2007 15:00:00
>IssueID=3
>e
>inizio: 11/10/2007 12:00:00
>fine: 11/10/2007 15:00:00
>IssueID=3
>
>io devo ottenere il tempo totale delle ore di lavoro.

Ciao Elisa,

Prova a dare un'occhiata al seguente esempio:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

>grazie.
Prego.

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

ape81 Profilo | Newbie

Ho visto l’esempio,

Questa e’ la mia tabella:


EngineerTimeID, UserID, IssueID, StartTime, EndTime
30 8 92 13/09/2007 12:30:00 13/09/2007 13:30:00
31 3 87 04/09/2007 10:00:00 04/09/2007 12:00:00
32 3 87 04/09/2007 10:00:00 04/09/2007 12:00:00
33 9 92 13/09/2007 12:15:48 13/09/2007 14:45:48
34 5 92 13/09/2007 07:00:00 13/09/2007 10:00:00
35 3 98 20/09/2007 11:00:00 20/09/2007 11:00:00
37 12 100 10/10/2007 15:00:00 10/10/2007 15:45:00
38 12 100 10/10/2007 16:50:00 10/10/2007 17:15:00
39 12 100 10/10/2007 12:30:00 10/10/2007 13:15:00
40 12 106 10/10/2007 12:30:00 10/10/2007 13:15:00
41 12 106 10/10/2007 16:50:00 10/10/2007 17:15:00
42 12 106 10/10/2007 15:00:00 10/10/2007 15:45:00

UserID = ID della tabella contenente il Nome
IssueID = ID della tabella contenente la descrizione del lavoro

Il group by lo devo fare per IssueID
Il where sul campo UserID.

Devo avere in pratica un raggruppamento per IssueID(descrizione lavoro) con il tempo totale per uno stesso utente.

Perdona la mia ignoranza a riguardo, ho parecchia confusione a riguardo;
non ho ben chiaro il with e funzione CRT che hai usato… ma in pratica e’ una query sulla tabella che hai creato… io potrei fare rif. Alla tabella che ho ed usare la stessa query? E [User]che cos’e’?
Ho provato

WITH CTE_SecondsPerUser([User], Seconds) AS
(
SELECT IssueID, SUM(DATEDIFF(SECOND, StartTime, EndTime))
FROM dbo.EngineerTime
Where UserID=12
GROUP BY IssueID
)
SELECT
[User]
, (Seconds / 86400) AS Days
, (Seconds / 3600) - (Seconds / 86400 * 24) AS Hours
, (Seconds / 60) - (Seconds / 86400 * 1440) - ((Seconds / 3600) - (Seconds / 86400 * 24) * 60) AS Minutes
, (Seconds % 60) AS Seconds

FROM CTE_SecondsPerUser;

non mi funziona ma se dovesse funzionare una volta ottenute le tre colonne con il totale delle ore, minuti, secondi e’ possibile riavere il totale tempo in un unica clonna?

……………………………………………………

Io usando la funzione DATEDIFF nella View in questo modo:
Select IssueID, DATEDIFF(hour,dbo.EngineerTime.StartTime, dbo.EngineerTime.EndTime) AS Hour, DATEDIFF(minute, dbo.EngineerTime.StartTime, dbo.EngineerTime.EndTime)AS Minute, DATEDIFF(second, dbo.EngineerTime.StartTime, dbo.EngineerTime.EndTime) AS Second
Where…

otterei ore min sec su tre colonne distinte e poi con una query il totale delle ore, dei min e dei secondi (distinti tra loro) raggruppati per IssueID. puo' essere una soluzione?

Poi pero’ c’e’ un metodo per riavere il valore tempo in un unica colonna?

grazie mille.
elisa

lbenaglia Profilo | Guru

>Perdona la mia ignoranza a riguardo, ho parecchia confusione
>a riguardo;
>non ho ben chiaro il with e funzione CRT che hai usato… ma in
>pratica e’ una query sulla tabella che hai creato…
Si esatto, le Common Table Expression (CTE) ti permettono di definire delle "viste temporanee" che puoi utilizzare nel comando di SELECT, INSERT, UPDATE o DELETE successivo.
Per maggiori info leggi il seguente paragrafo sui Books Online:

"WITH common_table_expression (Transact-SQL)"
http://msdn2.microsoft.com/en-us/library/ms175972.aspx

>io potrei fare rif. Alla tabella che ho ed usare la stessa query?
Certo, modificandola leggermente

>E [User]che cos’e’?
Un alias di colonna.

>non mi funziona ma se dovesse funzionare una volta ottenute le
>tre colonne con il totale delle ore, minuti, secondi e’ possibile
>riavere il totale tempo in un unica clonna?
Certo, guarda:

USE tempdb; CREATE TABLE dbo.EngineerTime( EngineerTimeID int NOT NULL PRIMARY KEY, UserID int NOT NULL, IssueID int NOT NULL, StartTime datetime NOT NULL, EndTime datetime NOT NULL ); INSERT dbo.EngineerTime VALUES(30, 8, 92, '20070913 12:30:00', '20070913 13:30:00'); INSERT dbo.EngineerTime VALUES(31, 3, 87, '20070904 10:00:00', '20070904 12:00:00'); INSERT dbo.EngineerTime VALUES(32, 3, 87, '20070904 10:00:00', '20070904 12:00:00'); INSERT dbo.EngineerTime VALUES(33, 9, 92, '20070913 12:15:48', '20070913 14:45:48'); INSERT dbo.EngineerTime VALUES(34, 5, 92, '20070913 07:00:00', '20070913 10:00:00'); INSERT dbo.EngineerTime VALUES(35, 3, 98, '20070920 11:00:00', '20070920 11:00:00'); INSERT dbo.EngineerTime VALUES(37, 12, 100, '20071010 15:00:00', '20071010 15:45:00'); INSERT dbo.EngineerTime VALUES(38, 12, 100, '20071010 16:50:00', '20071010 17:15:00'); INSERT dbo.EngineerTime VALUES(39, 12, 100, '20071010 12:30:00', '20071010 13:15:00'); INSERT dbo.EngineerTime VALUES(40, 12, 106, '20071010 12:30:00', '20071010 13:15:00'); INSERT dbo.EngineerTime VALUES(41, 12, 106, '20071010 16:50:00', '20071010 17:15:00'); INSERT dbo.EngineerTime VALUES(42, 12, 106, '20071010 15:00:00', '20071010 15:45:00'); WITH CTE_SecondsPerUser(IssueID, Seconds) AS ( SELECT IssueID, SUM(DATEDIFF(SECOND, StartTime, EndTime)) FROM dbo.EngineerTime WHERE UserID = 12 GROUP BY IssueID ) SELECT IssueID , RIGHT('0' + CAST(Seconds / 3600 AS varchar), 2) + ':' + RIGHT('0' + CAST(Seconds / 60 % 60 AS varchar), 2) + ':' + RIGHT('0' + CAST(Seconds % 60 AS varchar), 2) AS [Time] FROM CTE_SecondsPerUser; /* Output: IssueID Time ----------- -------- 100 01:55:00 106 01:55:00 (2 row(s) affected) */ DROP TABLE dbo.EngineerTime;

>grazie mille.
Prego.

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

ape81 Profilo | Newbie

ciao,

ora funziona perfettamente.
non ci sarei mai arrivata, devo mettermi a studiare un po' di SQL.

sei un grande... gentilissimo...

grazie mille.
elisa

ape81 Profilo | Newbie


Ma dato che sei stato cosi' gentile ti pongo un'ulteriore quesito.

Su sql tutto funziona, mi restituisce due colonne con i rispettivi valori.
ma se io riporto la stringa nel mio codice VB.net in questo modo:

Dim sSum As String
sSum = "GO"
sSum &= "WITH CTE_SecondsPerIssue(IssueId, Seconds) AS"
sSum &= "("
sSum &= "SELECT IssueId, SUM(DATEDIFF(SECOND, StartTime, EndTime))"
sSum &= " FROM dbo.EngineerTime WHERE UserId like '" & nUserID & "' GROUP BY IssueId"
sSum &= ")"
sSum &= "SELECT IssueId"
sSum &= ",RIGHT('0' + CAST(Seconds / 3600 AS varchar), 2) + ':' +"
sSum &= "RIGHT('0' + CAST(Seconds / 60 % 60 AS varchar), 2) + ':' +"
sSum &= "RIGHT('0' + CAST(Seconds % 60 AS varchar), 2) AS [Time]"
sSum &= "FROM CTE_SecondsPerIssue"
sSum &= "GO"

Mi restituisce un errore: Incorrect syntax near 'IssueId'.

In particolare ho fatto alcune prove e ho visto che si riferisce all'IssueId del whit CTE....WITH CTE_SecondsPerIssue(IssueId, Seconds) AS....

secondo te cosa puo' essere?
grazie ancora.
elisa

lbenaglia Profilo | Guru

>secondo te cosa puo' essere?
Elimina questa riga:
sSum = "GO"

La parola "GO" serve per isolare una sequenza di comandi (batch) ed è riconosciuta solo dagli strumenti client di SQL Server (SSMS, sqlcmd, osql, ecc.).

>grazie ancora.
Prego.

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

ape81 Profilo | Newbie


ok.

ciao
elisa
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