sql语句-希望从另一个日期中减去1个日期,并获取其间的天、小时和分钟

sql语句-希望从另一个日期中减去1个日期,并获取其间的天、小时和分钟,sql,sql-server,Sql,Sql Server,我想从另一个日期中减去一个日期,并得到这两个日期之间的天数、小时和分钟 我知道有一个DateDiff函数,但是它不适用于所有3个时间值;几天几小时几分钟。我希望这在SQL语句中是可行的。目前我有以下几点 SELECT id, pickupdateandtime, GETDATE() AS CurrentTime, (DATEDIFF(day,GETDATE(),pickupdateandtime)) AS Days, (DATEDIFF(hour,GETDATE(),pickupdatean

我想从另一个日期中减去一个日期,并得到这两个日期之间的天数、小时和分钟

我知道有一个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
结果是这样的:

如果我们可以将所有内容都放在一列中,那也没关系。

您需要使用
%
从小时中删除整天,从分钟中删除整小时

因此,您可以执行以下操作:

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
您需要使用
%
从小时中删除整天,从分钟中删除整小时

因此,您可以执行以下操作:

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

我同意@AndyMcLaughlin在这里使用mod运算符
%
。这种东西很方便。然而,我对
DATEDIFF
普遍不信任。该函数不计算两个日期之间的年数,而是计算它们之间的年边界数

因此
DATEDIFF
“认为”2000年1月1日
和2001年1月1日
之间的年差与2000年12月31日
和2001年1月1日
之间的年差相同

这就是为什么@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

我同意@AndyMcLaughlin在这里使用mod运算符
%
。这种东西很方便。然而,我对
DATEDIFF
普遍不信任。该函数不计算两个日期之间的年数,而是计算它们之间的年边界数

因此
DATEDIFF
“认为”2000年1月1日
和2001年1月1日
之间的年差与2000年12月31日
和2001年1月1日
之间的年差相同

这就是为什么@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

如果您的代码正常工作,那么您正在使用SQL Server。我做了适当的标记。如果你的代码有效,那么你正在使用SQL Server。我做了适当的标记,看起来不错。以前从未见过这个百分比,看起来像是其他种类的。也许我也需要减去1天tho,对吗?看起来不错。以前从未见过这个百分比,看起来像是其他种类的。也许我也需要减去1天tho,对吗?谢谢你提供的额外信息。今晚我要试试他的。我觉得我们很接近,但根据你的建议,我可能会达到100%。一切就绪。。谢谢你,史蒂夫,不用担心。我相信如果你认为一个新的答案更符合你的要求,你可以修改你接受的答案。谢谢你提供的额外信息。今晚我要试试他的。我觉得我们很接近,但根据你的建议,我可能会达到100%。一切就绪。。谢谢你,史蒂夫,不用担心。我相信如果你认为一个新的答案更符合你的要求,你可以修改你接受的答案。