在我的测试数据库中,日期以 DD/MM/YYYY 格式显示。显示的意思是当您右键单击时,在 Management Studio 中打开表格,返回的数据以 DD/MM/YYYY 格式显示。
有趣的是,当我编写 T-SQL 检索记录时,我必须输入 MM/DD/YYYY 格式才能取回正确的数据。无论如何我可以将它与 DD/MM/YYYY 格式对齐吗?
在我的测试数据库中,日期以 DD/MM/YYYY 格式显示。显示的意思是当您右键单击时,在 Management Studio 中打开表格,返回的数据以 DD/MM/YYYY 格式显示。
有趣的是,当我编写 T-SQL 检索记录时,我必须输入 MM/DD/YYYY 格式才能取回正确的数据。无论如何我可以将它与 DD/MM/YYYY 格式对齐吗?
您可以使用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
就个人而言,我总是使用 YYYY-MM-DD 格式(或 YYYYMMDD),因为它不是特定于文化的,而且,我想它对我很有吸引力,因为它是“合乎逻辑的”(尤其是在时间之后)。
[编辑:我只是在谈论我在 SQL 脚本中放入的内容,以确保无论服务器设置如何兼容,而不是 SQL Server“显示”]
您可以为每个单独的SQL Server 登录设置默认语言。记不太清了,大概是这样的:
sp_defaultlanguage @loginame = 'LoginName', @language = 'Language'
如果您以格式传入 DATETIME
dd MMM yyyy
例如
"11 JUL 2009"
月份和日期永远不会有任何歧义,因此您永远不会有问题
在几乎所有情况下,解决此问题的正确方法就是永远不要将日期视为字符串。如果您传入一个参数,或者使用(键入的)列值,那么服务器的文本转换根本就不是一个因素。除了避免 i18n 问题之外,这还减少了您的注入攻击面。它也节省了一些 CPU 周期;-p
如果您使用EXEC
的是动态 SQL,那么这同样应该通过sp_ExecuteSQL
.
我尽可能使用日期的 ODBC 规范形式 {d 'yyyy-mm-dd'} 这样我就知道 sql server 将如何解释它。它在 TSQL 中工作得很好。
将其添加到您的 web.config 文件中:
</system.web>
<globalization culture="en-US" uiCulture="en-US" />
</system.web>
或者您可以在页面上添加此语句:
<%@ Page uiCulture="en-US" culture="en-US" %>
希望这有帮助。