在其他地方看到一個有點意思的東西。是記錄轉換規則的。 求每個值輸出的結果是多少,我沒多想,直接得出 ...
在其他地方看到一個有點意思的東西。是記錄轉換規則的。
DECLARE @Date1 DATETIME = '2016-06-21 11:53:00' , @Date2 DATETIME = '2016-06-22 13:25:00' SELECT DATEDIFF(day, @Date1, @Date2) , CAST(@Date2 - @Date1 AS INT) , CAST(@Date2 AS INT) - CAST(@Date1 AS INT) , CAST(CAST(@Date2 AS FLOAT) - CAST(@Date1 AS FLOAT) AS INT)
求每個值輸出的結果是多少,我沒多想,直接得出
DATEDIFF(day, @Date1, @Date2) 1
, CAST(@Date2 - @Date1 AS INT) 1
, CAST(@Date2 AS INT) - CAST(@Date1 AS INT) 1
, CAST(CAST(@Date2 AS FLOAT) - CAST(@Date1 AS FLOAT) AS INT) 1
結果放在ssms上面執行,在這個部分答案出錯了
CAST(@Date2 AS INT) - CAST(@Date1 AS INT) 2
下麵是解釋過程
關於datetime 的數值存儲,數值部分是從1900-01-01 00:00:00 開始計算的,整數部分保存和這個日期差異的天數,小數部分記錄是該時間在一天裡面的比例。
DATEDIFF(day, @Date1, @Date2) 結果是1不是2(不是已經多了1天有多嗎?) 關於這個函數,對於day 的差值,只會精確到 day這這一層,即只對比年月日這3項。加入datediff 的參數是Month 那麼,比對的項只有年和月,以此類推。所以說雖然看起來超過了一天,但是相減轉換成int也是1
CAST(@Date2 - @Date1 AS INT) 1 日期的運算同上面一樣。而且datetime 轉換成數字也只會比對日期部分,所以答案就是1
CAST(@Date2 AS INT) - CAST(@Date1 AS INT) 2 這個就要看 cast 的轉化了。對於這個例子,把日期轉換成int 雖然只是跟日期部分有關,但是。這裡有個特殊的地方是只要時間部分超過了12點,就會+1(相當於四捨五入),所以答案是2
CAST(CAST(@Date2 AS FLOAT) - CAST(@Date1 AS FLOAT) AS INT) 1 這裡先轉化成浮點,然後相減之後轉換成int ,轉成浮點的時候,小數位就是計算時間部分占一天的比例。這樣看相減是比1多1點,燃鵝最後轉換成int ,就把小數位抹掉,就是1了
這個題目雖然簡單,但是也有一些我們平時使用的一些小細節,考察著我們開發人員對這些小點的關註,如果不註意的話還是有可能平時使用出現意想不到的狀況的。有時候不註意,查詢報表或者寫語句就很容易出現什麼數位溢出,轉換失敗之類的東東了。
這個確實要靠平時多註意,儘量少踩坑。
PS:如果說得不好或者理解有誤,歡迎各位拍磚
最後我也不知道為什麼,我已經超過150個字了也不允許我發╮(╯_╰)╭,我就湊一下字數,不要介意啊啊啊啊啊啊啊啊~~~