SQL Server用于解析的默认文化

时间:2017-08-04 13:55:35

标签: sql sql-server tsql

当我运行以下声明时:

SELECT CAST ('12/08/1988' AS DATE) AS BIRTHDAY

我得到1988-12-08,而不是1988-08-12的ISO 8601格式。 SQL Server如何决定应用哪种格式进行解析?我知道最佳实践,我只是对它在何处采取以及如何改变感兴趣?

3 个答案:

答案 0 :(得分:4)

SQL Server没有" culture",它只会将该格式的值解析为mm/dd/yyyy(即US格式)。您可以使用DATEFORMAT在某种程度上控制它,例如:

SET DATEFORMAT mdy

但是,这些是相当基本的格式,你真的应该避免依赖它们。

如果您想更改它,则应使用CONVERT功能或较新的PARSE。例如,要指定英国格式:

SELECT CONVERT(DATE, '12/08/1988', 103)

或者:

SELECT PARSE('12/08/1988' AS DATETIME USING 'en-GB')

答案 1 :(得分:4)

首先..解析日期的格式基于当前在活动会话中设置的环境语言。您可以使用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; 

每个新查询的默认语言设置在登录级别设置。您可以通过在 server-> Logins-> YourLogin-> Properties-> Default Language ALTER LOGIN命令

上的对象资源管理器中查找来更改它

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

您可以在此问题中找到更多相关信息: How to change default language for SQL Server?

最后,与其他人一样,您应该使用CONVERT with style,ISO格式和适当的数据类型来避免混淆。

我的提示: 如果你想在adhoc查询中转换字符串到日期(比如示例),请始终使用ISO格式,不需要担心格式,甚至不需要转换:

SELECT * FROM Table WHERE DateColumn = '20170325'

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

SELECT CONVERT(NVARCHAR(30), DateColumn, 104) FROM Table

答案 2 :(得分:0)

无论日期格式如何,这样做总是更可靠:

SELECT CAST ('1988-08-12' AS DATE) AS BIRTHDAY

由于您未指定格式,因此它将在您的SQL实例上使用默认日期格式,该格式类似于英语。