執行 T-SQL 查詢時,將 varchar 數據類型轉換為 datetime 數據類型導致值超出範圍
請注意,我絕不是編碼員,我只是想協助從 Server 2008 R2 和 SQL Server 2008 遷移到 Server 2022 和 SQL Server 2019。
我的情況如下
當我執行以下 T-SQL 查詢時:
select convert(datetime,'08/15/2022',103)
我收到上述錯誤:
將 varchar 數據類型轉換為 datetime 數據類型導致值超出範圍
當我將其更改為:
select convert(datetime,'08/15/2022',101)
…有用。
我的問題
有什麼方法可以執行一些 T-SQL 查詢來更改 SQL Server 2019 查看日期的方式並強制它使用英國英語?
伺服器區域設置已正確設置為英語南非(與英國英語相同),因此我不確定我還能在哪裡進行任何更改,以便我們獲得正確的日期和時間格式。這與我們正在執行的網站有關,我無法更改其編碼,因為我對 ASP 一無所知。
正如馬丁史密斯在他刪除的答案中指出的那樣:
它是登錄的預設語言,它決定了解釋字元串日期的預設方式,但這與您的問題無關,因為您無論如何都明確指定樣式參數。
可能的解決方案
儘管如此,我想指出幾個可能的解決方案。
警告
請在應用任何給定解決方案之前閱讀。
這兩種解決方案都可能導致生產問題。事先備份您的數據庫/數據。
1. 更改 SQL Server 實例語言
通過以下方式設置 SQL Server 實例的預設語言:
EXEC sys.sp_configure N'default language', N'23' GO RECONFIGURE WITH OVERRIDE GO
23 是英式英語的 langid,可以在
sys.syslanguages
表中檢索到:+--------+------------+-----------+---------+---------+-----------------+---------------------------------------------------------------------------------------+-------------------------------------------------+----------------------------------------------------------+------+-----------+ | langid | dateformat | datefirst | upgrade | name | alias | months | shortmonths | days | lcid | msglangid | +--------+------------+-----------+---------+---------+-----------------+---------------------------------------------------------------------------------------+-------------------------------------------------+----------------------------------------------------------+------+-----------+ | 23 | dmy | 1 | 0 | British | British English | January,February,March,April,May,June,July,August,September,October,November,December | Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec | Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday | 2057 | 1033 | +--------+------------+-----------+---------+---------+-----------------+---------------------------------------------------------------------------------------+-------------------------------------------------+----------------------------------------------------------+------+-----------+
注意/注意!
但是,我不建議這樣做,因為您的 SQL Server 實例“已經”/“正在”使用預定義的語言執行。你可能會弄壞東西。 實施前請先測試!
您可以使用此腳本驗證伺服器的目前執行設置:
SELECT sc.value_in_use, sl.langid, sl.name, sl.alias,sl.[dateformat] FROM sys.configurations AS sc JOIN sys.syslanguages AS sl ON sl.langid = sc.value_in_use WHERE sc.name = 'default language';
在我的 SQL Server 實例上,這會產生:
+--------------+--------+------------+---------+------------+ | value_in_use | langid | name | alias | dateformat | +--------------+--------+------------+---------+------------+ | 0 | 0 | us_english | English | mdy | +--------------+--------+------------+---------+------------+
2.更改客戶端連接設置
使用以下 SET 命令更改目前正在執行的腳本中的語言設置:
set language = uk_english go <your statements> go
注意/注意
請在生產中使用前進行測試。
3.設置日期格式
在執行腳本之前更改日期格式:
set dateformat MDY go <your statements> go
4.更改SQL Server登錄的預設語言
如果您想更改 SQL Server 登錄的預設語言,請執行類似的腳本:
USE [master] GO ALTER LOGIN [mojo] WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[British], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF GO
參考閱讀