3

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

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

4 回答 4

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
于 2008-11-03T22:43:41.343 回答
1

这是一种方法:

-- 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
于 2008-11-03T22:27:47.007 回答
1

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

请参阅MSDN 的 DATEDIFF (Transact-SQL) 文章

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

为您的持续时间选择最小的公分母(可能是 ss 或 s)并基于此进行任何数学运算(正如其他答案所说明的那样,但不是真正描述的)。

于 2008-11-03T22:54:04.803 回答
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 小时,您将使用不同的表示逻辑。这只是我能想到的最快的。

于 2008-11-03T22:36:53.137 回答