2017-04-19 79 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