SQL Server日期时间问题。美国人与英国人?

时间:2009-07-27 08:47:32

标签: sql-server sql-server-2005 datetime date-formatting

在我的测试数据库中,日期以DD / MM / YYYY格式显示。显示我的意思是当你右键单击,在Management Studio中打开表格时,返回的数据以DD / MM / YYYY格式显示。

有趣的是,当我编写T-SQL来检索记录时,我必须输入一个MM / DD / YYYY格式来获取正确的数据。无论如何我可以将它与DD / MM / YYYY格式对齐吗?

7 个答案:

答案 0 :(得分:12)

您可以使用SET LANGUAGE在查询中选择SQL Server 期望 的日期格式(我认为管理工作室使用客户端)计算机的区域设置用于显示目的,但不确定)。但是,我建议使用参数传递值,而不是在查询语句中嵌入它们。如果使用参数,则不会遇到任何问题。一切都得到了照顾。

set language us_english
declare @d datetime = '1929/12/18'

set language british
declare @d datetime = '1929/12/18' -- fails

更改服务器默认语言:

declare @langid int = (select langid from syslanguages where name = 'british')
exec sp_configure 'default language', @langid
reconfigure with override

答案 1 :(得分:4)

就个人而言,我总是使用YYYY-MM-DD格式(或YYYYMMDD)因为它不是特定于文化的,而且,我认为它吸引我,因为它是“合乎逻辑的”(特别是当然后是时间)。

[编辑:我只是在讨论我在SQL脚本中添加的内容,以确保兼容性,无论服务器设置如何,而不是SQL Server“显示”的内容]

答案 2 :(得分:3)

您可以为每个人SQL Server login设置默认语言。不记得了,但是这样的事情:

sp_defaultlanguage @loginame = 'LoginName', @language = 'Language'

答案 3 :(得分:2)

如果您以格式

传递DATETIME
dd MMM yyyy

例如

"11 JUL 2009"

在月份和日期之间永远不会有任何歧义,因此你永远不会有问题

答案 4 :(得分:1)

在几乎所有情况下,解决此问题的正确方法是永远不要将日期视为字符串。如果传入参数或使用(类型化)列值,则服务器的文本转换不是一个因素。除了避免i18n问题,这也减少了你的注射攻击面。它也节省了一些CPU周期; -p

如果您使用EXEC进行动态SQL,那么同样应该通过sp_ExecuteSQL进行参数化。

答案 5 :(得分:1)

我尝试尽可能使用日期的ODBC规范形式 {d'yyyy-mm-dd'} 这样我知道sql server将如何解释它。 它适用于TSQL。

答案 6 :(得分:1)

将其添加到您的web.config文件中:

</system.web>
    <globalization culture="en-US" uiCulture="en-US" />
</system.web>

或者您可以在页面上添加此声明:

<%@ Page uiCulture="en-US" culture="en-US" %>

希望得到这个帮助。