当我运行以下声明时:
SELECT CAST ('12/08/1988' AS DATE) AS BIRTHDAY
我得到1988-12-08,而不是1988-08-12的ISO 8601格式。 SQL Server如何决定应用哪种格式进行解析?我知道最佳实践,我只是对它在何处采取以及如何改变感兴趣?
答案 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实例上使用默认日期格式,该格式类似于英语。