我想从另一个中减去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
它显示如下:
如果我们可以将它全部放在1列中,那也很好。
答案 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-2000
和01-Jan-2001
之间的差异与31-Dec-2000
和01-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