解析SQL Server中SQL日期轉(zhuǎn)換出錯的原因
開發(fā)人員有時候使用類似下面SQL將字符串轉(zhuǎn)換為日期時間類型,乍一看,這樣的SQL的寫法是沒有什么問題的。但是這樣的SQL其實(shí)有時候就是一個定時炸彈,隨時可能出現(xiàn)問題(),下面簡單對這種情況進(jìn)行一個簡單概括。
SELECT CONVERT(DATETIME, '2020-01-13 6:46:42');
如果你將連接數(shù)據(jù)庫的登錄名的默認(rèn)語言修改為Aribc,然后去執(zhí)行上面SQL語句,就會遇到錯誤,為什么呢?
為什么上面SQL的日期轉(zhuǎn)換出錯了呢?其實(shí)是因?yàn)榈卿浢薷哪J(rèn)語言后,會話對應(yīng)的date_format變化了,從mdy變成了dmy,所以上面轉(zhuǎn)換就報(bào)錯了,有時候不報(bào)錯,但是可能轉(zhuǎn)換成一個錯誤日期,產(chǎn)生了邏輯錯誤,這個反而是一個跟糟糕的隱性錯誤。等你發(fā)現(xiàn)的時候,可能已經(jīng)產(chǎn)生大量錯誤數(shù)據(jù)了。
SELECT session_id ,program_name ,client_interface_name ,language ,date_format FROM sys.dm_exec_sessions WHERE session_id = 53;
關(guān)于不同語言的默認(rèn)date_format,可以使用下面命令查看:
sp_helplanguage 'us_english'
另外一種情況,如果當(dāng)前會話使用SET命令修改過DATEFORMAT,也會遇到這個錯誤,如下所示:
SET DATEFORMAT DMY; GO SELECT CONVERT(DATETIME, '2020-01-13 6:46:42');
這種情況就比較復(fù)雜了,有可能是某一段SQL里面設(shè)置了DATEFORMAT,導(dǎo)致整個會話后面的日期格式全部變化了。所以上面這種SQL的“健壯性”就比較差,在平時就要避免寫出這樣的SQL,如果你使用這樣的SQL,不管是會話的默認(rèn)語言變化了,還是當(dāng)前會話的DATEFORMAT變化了,都不會產(chǎn)生錯誤或邏輯錯誤。
SELECT CONVERT(DATETIME,'2020-01-13 6:46:42', 120)。
平時遇到這種日期轉(zhuǎn)換,就一定要明確指定轉(zhuǎn)換格式,讓其不要受會話的DATEFORMAT變化影響,書寫健壯、可靠的SQL語句,下面這兩個簡單SQL的細(xì)微差別,也可判別一個人是否用有書寫健壯性SQL的意識!
SELECT CONVERT(DATETIME, '2020-01-13 6:46:42'); SELECT CONVERT(DATETIME, '2020-01-13 6:46:42', 120)
總結(jié)
以上所述是小編給大家介紹的解析SQL Server中SQL日期轉(zhuǎn)換出錯的原因,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
- MySQL日期函數(shù)與日期轉(zhuǎn)換格式化函數(shù)大全
- MySQL中日期和時間戳互相轉(zhuǎn)換的函數(shù)和方法
- 分享Sql日期時間格式轉(zhuǎn)換
- SQL SERVER 日期格式轉(zhuǎn)換詳解
- SQLserver中用convert函數(shù)轉(zhuǎn)換日期格式的方法
- PHP+Mysql日期時間如何轉(zhuǎn)換(UNIX時間戳和格式化日期)
- SQL學(xué)習(xí)筆記七函數(shù) 數(shù)字,日期,類型轉(zhuǎn)換,空值處理,case
- mysql 日期和時間格式轉(zhuǎn)換實(shí)現(xiàn)語句
- sql語句中如何將datetime格式的日期轉(zhuǎn)換為yy-mm-dd格式
相關(guān)文章
SQL SERVER數(shù)據(jù)轉(zhuǎn)換失敗的原因及解決方法
在使用 SQL Server 數(shù)據(jù)庫過程中,我們經(jīng)常會遇到數(shù)據(jù)轉(zhuǎn)換失敗的情況,當(dāng) SQL Server 在執(zhí)行查詢、插入或更新操作時,如果發(fā)現(xiàn)數(shù)據(jù)類型不匹配或無法進(jìn)行有效的轉(zhuǎn)換,就會拋出轉(zhuǎn)換失敗的錯誤,本文給大家介紹了SQL SERVER數(shù)據(jù)轉(zhuǎn)換失敗的原因及解決方法2024-09-09SQL Server誤區(qū)30日談 第3天 即時文件初始化特性可以在SQL Server中開啟和關(guān)閉
即時文件初始化是一個在SQL Server 2005以及之上的版本鮮為人知的特性。這個特性允許數(shù)據(jù)文件(僅僅是數(shù)據(jù)文件,不包括日志文件)初始化的過程跳過填0初始化過程。這種方式是在發(fā)生災(zāi)難時大大減少Downtime的好辦法---在恢復(fù)數(shù)據(jù)庫時由于免去了填0初始化的過程而直接開始恢復(fù)過程2013-01-01SqlServer Mysql數(shù)據(jù)庫修改自增列的值及相應(yīng)問題的解決方案
這篇文章主要介紹了SqlServer Mysql數(shù)據(jù)庫修改自增列的值及相應(yīng)問題的解決方案的相關(guān)資料,需要的朋友可以參考下2016-01-01SQL Server的鏈接服務(wù)器技術(shù)小結(jié)
這篇文章主要介紹了SQL Server的鏈接服務(wù)器技術(shù)的相關(guān)資料,需要的朋友可以參考下2014-07-07SQL語句實(shí)現(xiàn)查詢SQL Server服務(wù)器名稱和IP地址
這篇文章主要介紹了SQL語句實(shí)現(xiàn)查詢SQL Server服務(wù)器名稱和IP地址,本文分別給出查詢語句,需要的朋友可以參考下2015-07-07