2017-04-19 77 views
1

我想從另一個日期減去1個日期,並獲得中間的小時和分鐘。sql語句 - 想從另一個減去1個日期,並獲得日期和分鐘之間

我知道有一個DateDiff函數,但它不適用於所有3個時間值;幾小時和一分鐘。我希望這可以在SQL語句中實現。目前我有以下。

SELECT id, pickupdateandtime, GETDATE() AS CurrentTime, 
(DATEDIFF(day,GETDATE(),pickupdateandtime)) AS Days, 
(DATEDIFF(hour,GETDATE(),pickupdateandtime)) AS Hours, 
(DATEDIFF(minute,GETDATE(),pickupdateandtime)) AS Mins FROM orders 

而且它顯示是這樣的:

enter image description here

如果我們能夠堅持這一切在1列也沒關係。

+0

如果您的代碼正常工作,那麼您使用的是SQL Server。我恰當地標記了。 –

回答

0

我@AndyMcLaughlin同意關於使用Mod運算符%這裏的。這種東西非常方便。但是,我對DATEDIFF普遍不信任。該函數不計算兩個日期之間的整個年數(比如說),而是計算它們之間的年份邊界數。

所以DATEDIFF「認爲」 01-Jan-200001-Jan-2001之間多年的區別是一樣的31-Dec-200001-Jan-2001之間。

這就是爲什麼@Michael看到需要從@ AndyMcLaughlin的結果中減去1。不幸的是,這並不總是奏效,它將取決於個案。

作爲一項規則,DATEDIFF適用於您感興趣的最小時間間隔。因此,如果您對多年感興趣並且只想將一個日曆年與另一個日曆年分開,它將爲您提供良好的服務。

我認爲我們感興趣的最小間隔是分鐘。因此,我們可以使用DATEDIFF,但必須從那裏向上工作幾小時和幾天:

select 
    mf.id, 
    mf.pickupdateandtime, 
    mf.CurrentTime, 
    --The divisions in the following lines simply 
    --truncate since all the numbers are integers 
    --but that works in our favour here 
    (mf.MinutesFull/(60*24)) as Days, 
    (mf.MinutesFull/60) % 24 as Hours, 
    mf.MinutesFull % 60 as Minutes 
from 
    (
    select 
     id, 
     pickupdateandtime, 
     getdate() as CurrentTime, 
     datediff(minute, getdate(), pickupdateandtime) as MinutesFull 
    from @orders 
    ) mf 
+0

感謝您的額外信息。我今晚會嘗試他。我覺得我們很接近,但是你的建議我可能會達到100%。 – Michael

+0

All Set ..謝謝Steve。 – Michael

+0

不用擔心。如果您認爲新的更符合您的要求,我相信您可以更改您接受的答案。 –

0

您需要使用mod operator%從幾小時和整個幾小時中刪除整整幾天。

所以,你可以這樣做:

SELECT 
    id, 
    pickupdateandtime, 
    GETDATE() AS CurrentTime, 
    (DATEDIFF(day,GETDATE(),pickupdateandtime)) AS Days, 
    (DATEDIFF(hour,GETDATE(),pickupdateandtime) % 24) AS Hours, 
    (DATEDIFF(minute,GETDATE(),pickupdateandtime) % 60) AS Mins FROM orders 
+0

看起來不錯。從來沒有見過這個%,看起來像其餘的種類。也許我需要減去1天壽,對吧? https://i.stack.imgur.com/RsaNH.png – Michael