2017-07-18 73 views
1

溢出我有一個表中的SQL Server 2016以下數據:DATEDIFF函數導致在SQL Server 2016

id  | t      | memory 
-------+-------------------------+------------ 
620255 | 2017-07-17 16:11:25.100 | 11632640 
620127 | 2017-07-17 16:11:24.100 | 11632640 
619999 | 2017-07-17 16:11:23.097 | 11632640 
619872 | 2017-07-17 16:11:22.097 | 11632640 

我試圖讓memory每秒的平均值。因此,爲了做到這一點我想下面的查詢:

​​

但在執行時,我收到以下錯誤:

The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.

由於每official docsSO post,幾秒鐘的最大差異是68年,但在我的情況下,只有60秒。

那麼,爲什麼我會得到這個錯誤?我能做些什麼來解決它?

這裏是所提到的問題SQLFiddle:Fiddle

+0

對我來說,它看起來像你計算日期0和你的t值之間的差異。您是否想要計算最小t值與當前t值之間的差值? –

+0

'DATEDIFF(秒,0,t)'有問題。你想用這個做什麼? – Rokuto

+0

我想按秒/分鐘/小時對時間戳進行分組(取決於用戶選擇)。 –

回答

1

這裏的問題是「開始日期」。

select DATEDIFF(second, 0, t) 0表示1900-01-01與2017年相距太遠,所以從1900-01-01到2017-07-17的時間以秒爲單位溢出了簡單整數,它不僅僅是「60秒」

+0

是的,謝謝你的想法。我將我的開始日期從0更新爲2017-01-01 00:00:00:00,因爲我知道在此之前我沒有時間戳。 –

1

SQL Server提供datediff_big()爲了這個目的:

SELECT AVG(memory) AS avgMemory, 
     CONVERT(VARCHAR(19), t, 120) as t 
FROM Table1 AS Table1 
WHERE t BETWEEN '2017-07-17 16:11:00.000' AND '2017-07-17 16:12:00.000' 
GROUP BY CONVERT(VARCHAR(19), t, 120) 
ORDER BY t ASC; 

SELECT AVG(memory) AS avgMemory, 
     DATEADD(second, DATEDIFF_BIG(second, 0, t), 0) AS t 
FROM Table1 AS Table1 
WHERE t BETWEEN '2017-07-17 16:11:00.000' AND '2017-07-17 16:12:00.000' 
GROUP BY DATEADD(second, DATEDIFF_BIG(second, 0, t), 0) 
ORDER BY t ASC; 

您還可以通過數值轉換爲字符串做到這一點

此版本適用於所有支持的SQL Server版本。

+0

從2016開始吧?如果他在以前的版本? – sepupic

+1

@sepupic OP明確提到了SQL Server 2016. –

+0

我會嘗試這個。 –

1

您還可以使用不同的日期(例如2017-07-17 00:00:00.000)作爲固定點爲您算了一筆賬:

SELECT AVG(memory) AS memory, 
    DATEADD(second, 
      DATEDIFF(second, '2017-07-17 00:00:00.000', t), 
      '2017-07-17 00:00:00.000') AS t 
FROM Table1 AS Table1 
WHERE t BETWEEN '2017-07-17 16:11:00.000' AND '2017-07-17 16:12:00.000' 
GROUP BY DATEADD(second, 
       DATEDIFF(second, '2017-07-17 00:00:00.000', t), 
       '2017-07-17 00:00:00.000') 
ORDER BY t ASC; 

SQL Fiddle

+0

開始和結束日期來自用戶界面,所以我不能有一個靜態的日期。 –

+1

對不起,我誤解了你的答案,但現在我明白你在說什麼了。它的工作原理。我將開始日期更改爲2017-01-01 00:00:00。000 –