有時候我們會發現,一些系統DMV中的時間值(單位亳秒)欄位為負數,如下圖
以 sys.dm_exec_requests 的 total_elapsed_time 為例,它是一個int
範圍是:–2,147,483,648 到 2,147,483,647
正常情況下,它是一個正整數值,從0 ~ 2147483647
二進位表示為 00000000 00000000 00000000 00000000 ~ 01111111 11111111 11111111 11111111
但如果一個query執行時間,超過 2147483647 ,再往上加1,就會變成
10000000 00000000 00000000 00000000
上面這個值,在int的型態中,就表示「負數」,依照「二補數」的算法,其值為 -2147483648(第一位為1,表示負數)
所以一旦它的執行時間超過了2147483647 ,就會開始從-2147483648遞增至 0.
因此,像是這類型態的欄位值,其數字週期,如下所示:
0 → 2147483647 → -2147483648 → 0 → 循環往復
查詢這類型態的欄位值,如果不加轉換,直接取其值的話,就有可能會得到上面那張圖所看到的負值。
像這樣的值,可以用下列的語法來查詢
case
when [欄位名] < 0
then 2147483647+(2147483649+[欄位名])
else [欄位名]
end as [欄位別名]
像上面的數字週期所示,從0開始累積最後再到0,大約是48天。但如果它的值真的夠大,超過了48天,又進入循環往復了。那麼就查不出其真正的值了。
沒有留言:
張貼留言