Sql-Server

執行 T-SQL 查詢時,將 varchar 數據類型轉換為 datetime 數據類型導致值超出範圍

  • August 15, 2022

請注意,我絕不是編碼員,我只是想協助從 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

參考閱讀

引用自:https://dba.stackexchange.com/questions/315619