SQL Server 用于解析的默认区域性

Eng*_*ock 1 sql t-sql sql-server

当我运行以下语句时:

SELECT CAST ('12/08/1988' AS DATE) AS BIRTHDAY
Run Code Online (Sandbox Code Playgroud)

我得到的是 1988-12-08,而不是 ISO 8601 格式的 1988-08-12。SQL Server 如何决定申​​请解析的格式?我知道最佳实践,我只是对它在哪里以及如何更改感兴趣?

Nen*_*vic 5

首先......解析日期的格式基于当前在活动会话中设置的环境语言。您可以查看当前语言,SELECT @@LANGUAGE并且可以使用SET LANGUAGE命令更改它。

接下来,您可以通过使用SET DATEFORMAT设置您自己的日期格式来覆盖当前语言的格式。但是,请注意,如果您再次更改语言,它会覆盖格式设置。

以下是关于不同设置如何表现和影响 CAST 查询的几个示例:

SET LANGUAGE Italian
SELECT @@LANGUAGE
, CAST ('12/08/1988' AS DATE) AS BIRTHDAY
, DATENAME(month,CAST ('12/08/1988' AS DATE)) AS MonthName; 

SET LANGUAGE English
SELECT @@LANGUAGE
, CAST ('12/08/1988' AS DATE) AS BIRTHDAY
, DATENAME(month,CAST ('12/08/1988' AS DATE)) AS MonthName; 

SET DATEFORMAT DMY
SELECT @@LANGUAGE
, CAST ('12/08/1988' AS DATE) AS BIRTHDAY
, DATENAME(month,CAST ('12/08/1988' AS DATE)) AS MonthName; 
Run Code Online (Sandbox Code Playgroud)

每个新查询的默认语言设置都是在登录级别设置的。您可以通过在服务器->登录->您的登录->属性->默认语言上的对象资源管理器中查找或使用ALTER LOGIN命令来更改它

此外,服务器上还有一种默认语言,它会影响新创建的登录名的默认选择。

您可以在以下问题中找到更多相关信息: 如何更改 SQL Server 的默认语言?

最后,就像其他人所说的那样,您应该通过将CONVERT 与 style、ISO 格式和适当的数据类型一起使用来避免混淆。

我的提示:如果您想在临时查询中将字符串转换为日期(如示例中所示),请始终使用 ISO 格式,无需担心格式,甚至不需要转换:

SELECT * FROM Table WHERE DateColumn = '20170325'
Run Code Online (Sandbox Code Playgroud)

如果要将日期转换为字符串(用于显示),请使用具有所需样式的 CONVERT:

SELECT CONVERT(NVARCHAR(30), DateColumn, 104) FROM Table
Run Code Online (Sandbox Code Playgroud)