2013-10-15 113 views
2

這是我的代碼,結果是1,但它必須是0,因爲持續時間不是一分鐘DATEDIFF不正確的結果

DECLARE @Start AS DATETIME = '2013-10-08 09:12:59.000' 
DECLARE @End AS DATETIME = '2013-10-08 09:13:09.000' 

SELECT DATEDIFF(MI,@Start, @End) 

我怎樣才能解決這個問題? 我正在使用SQL Server 2008 R2。

更新

它正常工作與秒.....只是沒有幾分鐘。

DECLARE @Start AS DATETIME = '2013-10-08 09:12:59.000' 
DECLARE @End AS DATETIME = '2013-10-08 09:13:09.000' 

SELECT DATEDIFF(SS,@Start, @End) 
+2

['DATEDIFF'](http://technet.microsoft.com/en-us/library/ms189794.aspx):「返回指定的計數(有符號整數)日期部分**邊界在指定的開始日期和結束日期之間交叉**。「 (我的重點)在你的開始日期和結束日期之間,你從09:12到09:13穿越了分鐘界限。 –

回答

2

劃分試試這個

DECLARE @Start AS DATETIME = '2013-10-08 09:12:59.000' 
DECLARE @End AS DATETIME = '2013-10-08 09:13:09.000' 

SELECT DATEDIFF(SS,@Start, @End)/60 
+1

'2013-10-08 09:12:59.997'和'2013-10-08 09:13:59.000'仍然不是一整分鐘,並且返回'1'。 –

+0

@馬丁史密斯我同意你的意見。此外這個解決方案也會導致溢出錯誤,如果開始是1900並且結束是今天 –

+0

@MartinSmith:不知道你爲什麼說,或者他是否改變了它,但是按照它現在,[這不會返回1](http:///sqlfiddle.com/#!3/d41d8/22747) – Kaf

3

DATEDIFF很簡單,如果你比較幾分鐘,它不會花費幾秒鐘的時間。

更改您的查詢以秒爲單位獲得差異,並將其除以60,向下舍入。

+1

奇怪的是,秒數確實需要考慮分鐘數。 – Etienne

2

9:12至9:13 =1分鐘

,如果你想更好的分辨率,使用秒(SS)爲您的日期部分,然後通過60

2

由於@MartinSmith提到,目前的解決方案並沒有處理毫秒,這裏是一個更精確的方法

declare @t table(date1 datetime, date2 datetime) 
insert @t values('2013-10-08 09:12:00', '2013-10-08 09:13:59') 
insert @t values('2013-10-08 09:12:30', '2013-10-08 09:13:29') 
insert @t values('2013-10-08 09:12:30:111', '2013-10-08 09:13') 
insert @t values('2013-10-08 09:12:30:111', '2013-10-08 09:13') 
insert @t values('2013-10-08 09:12:30', '2013-10-08 09:12') 

select case when date2 > date1 
     then datediff(minute, 0, date2-date1) 
     else -datediff(minute, 0, date1 - date2) 
     end 
from @t 
+0

我認爲你的一個是正確的。 + 1. – Kaf

0

爲了更準確,你可以使用:

DECLARE @Start AS DATETIME = '2013-10-08 09:12:59.997' 
DECLARE @End AS DATETIME = '2013-10-08 09:13:59.000' 

SELECT DATEDIFF(MS,@Start, @End)/60000.00 

但是你應該知道,之間的差異 '2013年10月8日09:12:59.001' 和「2013年10月8日09:13:59.000 '將在這種情況下也是1.

+0

嘗試START ='2013-10-08',END ='2013-11-08'。結果會溢出 –