我有一个查询,其中我将拉动可执行文件的运行时。数据库包含其开始时间和结束时间。我想得到跑步的总时间。 到目前为止,我有:
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也是可行的。答案 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小时,您将使用不同的演示逻辑。这正是我能想到的最快的。