2012-05-29 19 views
5

Şu anda DD: HH: MI: SEC biçiminde sonuç verecek iki tarih arasındaki farkı hesaplamak için bir SQL komut dosyası üzerinde çalışıyorum. Örnek: tarihi 1: 7/30/12 16:00 tarihi 2: sonucu olmalıdır 5/4/12 10:31DateDiff'i gün cinsinden SQL olarak hesapla: Saatler: Dakikalar: Saniye biçimi

Ve 87: 05: 29: 00

Can Bunun için senaryoya yardım edermisin? Selamlar, Arjun

+2

? sql-server, oracel, mysql – Arion

+0

Hangi RDBMS ve ne denediniz? – Rahul

+0

Bu 26k görünümleri ve bunun için bir altın rozet var: | – OGHaza

cevap

9

o zaman bunu yapabilirsiniz sql-sunucu kullanıyorsanız:

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) 

Referans burada düşünmek için biraz zaman aldı ve Merhaba ben, benzer bir sorun vardı here

0

var benim Çözüm, kullanıcı abonelikleri ile tablo vardı, üzgün başlangıç ​​zamanı ve kapanış zamanı vardı, benim sorunum biraz daha karmaşık bit temel olarak bu aşağı geldi:

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` 

Temel olarak, bu sorgunun yaptığı şey, ilk satırdaki tarihleri ​​keserek günleri hesaplamasıdır. Sonra tam günlerin sayısını başlangıç ​​saatine ekler ve kapanış süresini toplamı azaltır, o halde kalan günkü saattir. Bundan sonra sadece Saatler, dakikalar ve saniyeler seçersiniz. Eğer hep birlikte isterseniz dizeleri birleştirebilirsiniz, ancak bu şekilde dizeleri farklı şekilde kullanabilirsiniz. Bazı hesaplama gerçekleştirmek istiyorsanız

0

Eh, siz de yapabilirsiniz: Ne kullanıyorsunuz

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 
İlgili konular