2013-11-21 84 views
1

我創建了一個函數,它接受兩個日期,並返回描述時間這樣的兩個日期之間的時間:計算流逝與時代

1年3個月2周1天10小時

我現在面臨的問題使用此功能的是,如果持續時間少於一個月,但如果兩個日期屬於不同月份,則返回月份持續時間。

有人可以幫我調整這個功能嗎?

您可以在這裏找到查詢:

http://data.stackexchange.com/stackoverflow/query/edit/149306

正如你可以看到我傳遞的開始日期爲2013-08-29 13:48:35.710和結束日期爲2013-09-03 17:04:27.493並應返回時間爲5 days 3 hours 15 minutes但它返回1月3小時15分鐘。

我該如何調整它以顯示正確的持續時間?

+0

確定分鐘(或小時)的時間差僅然後用數學的方法計算的其餘部分(每小時60分鐘,每天1440分鐘,每週10080分鐘等),從總分鐘減去當你去時。您可能還需要考慮閏年,但如果正確完成,它是一個可行且準確的選項。 – user3004228

+0

呃,沒有。 4個月=多少個小時?使用內置的日期操作,而不是編寫在DST,閏年和閏秒上失敗的糟糕的日期操作。 – Anon

回答

3
DECLARE @date1 DATETIME, @date2 DATETIME 
DECLARE @result VARCHAR(100) 
DECLARE @years BIGINT, @months BIGINT, @weeks BIGINT, @days BIGINT, @hours BIGINT, @minutes BIGINT 
DECLARE @KEEP DATETIME 

SET @date1 = '20130829 13:48:35.710' 
SET @date2 = '20130903 17:04:27.493' 

if @date1>@date2 
begin 
    SET @[email protected] 
    SET @[email protected] 
    SET @[email protected] 
end 

Select @years=DATEDIFF(yy,@date1,@date2) 
if DateAdd(yy,[email protected],@date2)<@date1 Select @[email protected] 
Set @date2= DateAdd(yy,[email protected],@date2) 

Select @months=DATEDIFF(mm,@date1,@date2) 
if DateAdd(mm,[email protected],@date2)<@date1 Select @[email protected] 
Set @date2= DateAdd(mm,[email protected],@date2) 

Select @weeks=DATEDIFF(wk,@date1,@date2) 
if DateAdd(wk,[email protected],@date2)<@date1 Select @[email protected] 
Set @date2= DateAdd(wk,[email protected],@date2)   

Select @days=DATEDIFF(dd,@date1,@date2) 
if DateAdd(dd,[email protected],@date2)<@date1 Select @[email protected] 
Set @date2= DateAdd(dd,[email protected],@date2) 

Select @hours=DATEDIFF(hh,@date1,@date2) 
if DateAdd(hh,[email protected],@date2)<@date1 Select @[email protected] 
Set @date2= DateAdd(hh,[email protected],@date2) 

Select @minutes=DATEDIFF(mi,@date1,@date2) 

Select @result= ISNULL(CAST(NULLIF(@years,0) as varchar(10)) + ' Years','') 
    + ISNULL(' ' + CAST(NULLIF(@months,0) as varchar(10)) + ' Months','') 
    + ISNULL(' ' + CAST(NULLIF(@weeks,0) as varchar(10)) + ' Weeks','')  
    + ISNULL(' ' + CAST(NULLIF(@days,0) as varchar(10)) + ' Days','') 
    + ISNULL(' ' + CAST(NULLIF(@hours,0) as varchar(10)) + ' Hours','') 
    + ISNULL(' ' + CAST(@minutes as varchar(10)) + ' Minutes','') 

Select @result  

-- OUTPUT : 5 Days 3 Hours 16 Minutes 
+0

我愛你如何將OP的代碼重構成一個小巧,緊湊的工作版本:) – Shiva

+0

很好的解決方案,但它的缺失周組件。這不是投訴。 :) – Asdfg

+0

@Asdfg oups,對不起,我忽略了: - {..我做了一個編輯... – bummi