2012-05-29 18 views
5

Attualmente sto lavorando a uno script SQL per calcolare la differenza tra due date che mi darebbero il risultato in formato DD: HH: MI: SEC. Esempio: Data 1: 7/30/12 16:00 Data 2: 5/4/12 10:31Calcola DateDiff in SQL in Giorni: Ore: Min: Formato secondi

E il risultato dovrebbe essere 87: 05: 29: 00

Can sei gentilmente di aiuto con la sceneggiatura per questo? Saluti, Arjun

+2

Cosa stai usando? sql-server, oracel, mysql – Arion

+0

Quali RDBMS e cosa hai provato? – Rahul

+0

Ha ottenuto 26k visualizzazioni e un distintivo d'oro per questo: | – OGHaza

risposta

9

Se si utilizza SQL-Server, allora si può fare questo:

declare @x int, 
     @dt1 smalldatetime = '1996-03-25 03:24:16', 
     @dt2 smalldatetime = getdate() 

set @x = datediff (s, @dt1, @dt2) 


SELECT convert(varchar, @x/(60 * 60 * 24)) + ':' 
+ convert(varchar, dateadd(s, @x, convert(datetime2, '0001-01-01')), 108) 

Riferimento here

0

Ciao ho avuto un problema simile, ha preso un po 'di tempo per pensare e qui è la mia soluzione, ho avuto il tavolo con abbonamenti degli utenti, lì triste orario di partenza e orario di chiusura, il mio problema era un po 'più complesso po' fondamentalmente si riduceva a questo:

SELECT subscription_id, time_open, time_closed, TIMESTAMPDIFF(DAY,time_open,time_closed) AS Day, 

HOUR(sec_to_time(TIMESTAMPDIFF(SECOND,ADDDATE(`time_open`, INTERVAL TIMESTAMPDIFF(DAY,time_open,time_closed) DAY),`time_closed`))) AS Hour, 

MINUTE(sec_to_time(TIMESTAMPDIFF(SECOND,ADDDATE(`time_open`, INTERVAL TIMESTAMPDIFF(DAY,time_open,time_closed) DAY),`time_closed`))) AS Minute, 

SECOND(sec_to_time(TIMESTAMPDIFF(SECOND,ADDDATE(`time_open`, INTERVAL TIMESTAMPDIFF(DAY,time_open,time_closed) DAY),`time_closed`))) AS Second 

FROM `user_subscription` 

Quindi, in sostanza, ciò che fa questa query è che calcola i giorni deducendo le date nella prima riga. Quindi aggiunge il numero di giorni interi all'ora di inizio e riduce il tempo di chiusura della mia somma, quindi ciò che rimane è l'ora nel giorno corrente. Dopodiché basta selezionare Ore, minuti e secondi da quello. Se lo vuoi tutto insieme puoi concatenare le stringhe ma in questo modo puoi usarlo ulteriormente, a differenza delle stringhe.

0

Beh, se vuole eseguire alcuni calcoli, si potrebbe fare anche questo:

DECLARE @SecsInADay INT = 60 * 60 * 24 
DECLARE @DATE1 DATETIME = CONVERT(DATETIME,'30/07/2012 16:00:00') 
DECLARE @DATE2 DATETIME = CONVERT(DATETIME,'04/05/2012 10:31:00') 
DECLARE @Days INT = DATEDIFF(DAY, @DATE2, @DATE1) 
DECLARE @DiffInSeconds INT = DATEDIFF(SECOND, @DATE2, @DATE1) 
DECLARE @TotalDaysInSeconds INT = @Days * @SecsInADay 
DECLARE @RemainingHours INT = @DiffInSeconds - @TotalDaysInSeconds 
DECLARE @Hours INT = @RemainingHours/3600 
DECLARE @Seconds INT = @RemainingHours % 3600 
DECLARE @Minutes INT = @Seconds/60 
DECLARE @RemainingSeconds INT = @Seconds % 60 

SELECT 
CASE WHEN @Days < 10 THEN '0' + CAST(@Days AS VARCHAR) ELSE CAST(@Days AS VARCHAR) END + ':' + 
CASE WHEN @Hours < 10 THEN '0' + CAST(@Hours AS VARCHAR) ELSE CAST(@Hours AS VARCHAR) END + ':' + 
CASE WHEN @Minutes < 10 THEN '0' + CAST(@Minutes AS VARCHAR) ELSE CAST(@Minutes AS VARCHAR) END + ':' + 
CASE WHEN @RemainingSeconds < 10 THEN '0' + CAST(@RemainingSeconds AS VARCHAR) ELSE CAST(@RemainingSeconds AS VARCHAR) END 
Problemi correlati