sql语句 - 想从另一个中减去1个日期,并获得几小时和几分钟之间的日期

时间:2017-04-19 01:53:22

标签: sql sql-server

我想从另一个中减去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列中,那也很好。

2 个答案:

答案 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

答案 1 :(得分: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