SQL:获取DATEDIFF不返回负值

时间:2008-11-03 22:18:56

标签: sql sql-server-2005 tsql datediff

我有一个查询,其中我将拉动可执行文件的运行时。数据库包含其开始时间和结束时间。我想得到跑步的总时间。 到目前为止,我有:

SELECT startTime, endTime,
cast(datediff(hh,starttime,endtime) as varchar)
+':'
+cast(datediff(mi,starttime,endtime)-60*datediff(hh,starttime,endtime) as varchar) AS RUNTIME
FROM applog
WHERE runID = 33871
ORDER BY startTime DESC 

当我执行此操作时,我得到了预期的值,也有些意外。 例如,如果starttime = 2008-11-02 15:59:59.790和endtime = 2008-11-02 19:05:41.857,则运行时为= 4:-54。 如何在MS SQL SMS中获取响应以返回值为3:06的情况?

感谢。

我选择了Eoin Campbell作为答案,对我的需求来说是最防弹的。大卫B也是可行的。

4 个答案:

答案 0 :(得分:3)

试试这些

假设2个宣布日期。

declare @start datetime
set @start = '2008-11-02 15:59:59.790'

declare @end datetime
set @end = '2008-11-02 19:05:41.857'

这将返回小时/分钟/秒

select 
    (datediff(ss, @start, @end) / 3600), 
    (datediff(ss, @start, @end) / 60) % 60,
    (datediff(ss, @start, @end) % 60) % 60

--returns

----------- ----------- -----------
3           5           42

这是零填充连接字符串版本

select
RIGHT('0' + CONVERT(nvarchar, (datediff(ss, @start, @end) / 3600)), 2) + ':' +
RIGHT('0' + CONVERT(nvarchar, (datediff(ss, @start, @end) / 60) % 60), 2) + ':' +
RIGHT('0' + CONVERT(nvarchar, (datediff(ss, @start, @end) % 60) % 60), 2)

--------
03:05:42

答案 1 :(得分:1)

Here's一种方法:

-- Find Hours, Minutes and Seconds in between two datetime
DECLARE @First datetime
DECLARE @Second datetime
SET @First = '04/02/2008 05:23:22'
SET @Second = getdate()

SELECT DATEDIFF(day,@First,@Second)*24 as TotalHours,
DATEDIFF(day,@First,@Second)*24*60 as TotalMinutes,
DATEDIFF(day,@First,@Second)*24*60*60 as TotalSeconds

答案 2 :(得分:1)

您需要与您对datediff()的调用保持一致。它们都应该使用相同的datepart参数。

请参阅MSDN's DATEDIFF (Transact-SQL) article

在您的示例中,您同时使用“mi”和“hh”并连接。

为你的持续时间(可能是ss或s)选择最小公分母,并根据它进行任何数学计算(正如其他答案所示,但没有真正描述)。

答案 3 :(得分:0)

您应该将计算和表示逻辑分开:

DECLARE @applog TABLE
(
  runID int,
  starttime datetime,
  endtime datetime
)

INSERT INTO @applog (runID, starttime, endtime)
SELECT 33871, '2008-11-02 15:59:59.790', '2008-11-02 19:05:41.857'
-------------------
SELECT
  SUBSTRING(convert(varchar(30), DateAdd(mi, duration, 0), 121),
  12, 5) as prettyduration
FROM
(
SELECT starttime, DateDiff(mi, starttime, endtime) as duration
FROM @applog
WHERE runID = 33871
) as sub

如果您需要代表超过24小时,您将使用不同的演示逻辑。这正是我能想到的最快的。