2016-07-28 148 views
1

我正在使用DATEDIFF確保某個動作不會每分鐘發生一次以上。DATEDIFF檢查一分鐘實際是一分鐘到兩分鐘

SELECT COUNT(*) 
FROM FOOD_ACTION 
WHERE 
DATEDIFF(MINUTE,INSERT_DT,GETDATE()) <= 1 

INSERT_DT是具有相同格式的日期列GETDATE()返回

如果有的話從該查詢返回的動作是不允許發生的。

事情是,它只有作品。我已經把它的範圍從一分鐘和10秒一直到幾乎兩分鐘,然後再讓它發生。似乎沒有任何一致性,如果它接近一兩分鐘,並且我已經確認GETDATE()與我的應用程序在設置INSERT_DT列時的確切時間相同。

不一致和錯誤的時間表是怎麼回事?

+0

採取差和使用'<60'。簡單的解釋是時間的秒部分被'datediff()'忽略。 – shawnt00

+0

原因是01:00:01距離01:02:00 119秒,其中的值最終會變成2 – Cato

+0

想起了我曾經決定過的一個原則 - 通常最好是在開始時間添加時間並等到時間已經過去了 – Cato

回答

4

當您執行datediff時,T-SQL將查找時間/日期部分邊界何時交叉以增加差異。

所以有:即使只有1毫秒的日期相差1

DECLARE @StartDate DATETIME = '2000-01-01T12:51:59.999', 
     @EndDate DATETIME = '2000-01-01T12:52:00:000' 

SELECT DATEDIFF(minute, @StartDate, @EndDate) 

你會得到的結果。

在實踐中,我首先要以較低的粒度,並尋找跨過自己,即解決這個問題:

DECLARE @StartDate DATETIME = '2000-01-01T12:51:59.999', 
     @EndDate DATETIME = '2000-01-01T12:52:00:000' 

SELECT 
    CASE WHEN DATEDIFF(second, @StartDate, @EndDate) >= 59 THEN CAST(1 as bit) 
     ELSE CAST(0 as bit) 
    END as InNewMinute 

這會給0爲1ms的顯然不是1分鐘差異。

注:上面的代碼顯然是隻用於處理1分鐘差異

見:MSDN DATEDIFF (Transact-SQL)(看日期部分邊界)

1
SELECT COUNT(*) 
FROM FOOD_ACTION 
    WHERE 
    DATEDIFF(MILLISECOND,INSERT_DT,GETDATE()) <= 60000 

也是爲什麼訪問所有數據,以指示什麼應該發生?好做

SELECT 1 as marker 
    WHERE 
    DATEDIFF(MILLISECOND,INSERT_DT,GETDATE()) <= 60000 

然後如果返回1,使用作爲參考,這種方式讀取任何數據並切斷網絡流量以秒可能