在Case When 給了 1=1 後,明明它會執行Convert成varchar的SQL,為何回傳不是CONVERT後的VARCHAR,而是Datetime呢?
今天同事問一個問題,覺得蠻有趣的,所以就記錄下來。
問題是在Case When 給了 1=1 後,明明它會執行Convert成varchar的SQL,為何回傳不是CONVERT後的VARCHAR,而是Datetime呢? 如下,
SELECT CASE WHEN 1=1
THEN
CONVERT(varchar ,GETDATE(),112)
ELSE
CMP_ENT_DTE --datetime
END
,CONVERT(varchar ,GETDATE(),112)
FROM EMP_EMPLOYEE
WHERE PER_SERIL_NO='911101'
看了執行計畫,輸出值在做好了CONVERT(varchar ,GETDATE(),112)後,又被專換成datetime型態了! 如下,
後來同事找到了「資料類型優先順序」,發現datetime的順序在varchar的前面,所以輸出就會使用datetime的資料型態輸出!
所以,如果將原本的varchar改成date,輸出型態也會是datetime。因為datetime的順序也是在date之前,如下,
那如果改成datetimeoffset,輸出資料型態,也就會變成了datetimeoffset了哦!因為datetimeoffset的順序也是在datetime之前,如下,
當然,大多數的人應該會先取出值之後,再進行Convert吧! 如下,
感謝同事 天使姐姐 的討論與分享!
參考資料
Use caution when Using CONVERT() with CASE or IF functions in Transact SQL (T-SQL)
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^