2011-04-13 117 views
2

看来这个问题被问了很多,但没有一个答案给了我结果。我在这里拉我的头发...所以希望有人有答案。SQL日期格式日期和月份混合

我有一台运行SQL Server 2005的生产服务器。我备份了数据库,并将其恢复到笔记本电脑的SQL Server Express实例中。现在日期查询受到严重影响。在刺激中。服务器全部存储为“4/13/2011 12:00:00 AM”格式,但在我的笔记本电脑上显示为“2011-04-14 00:00:00.000”。当我在“2011年4月14日”尝试查找条目时发生查询时,笔记本电脑给我提供了错误“将varchar数据类型转换为日期时间数据类型导致超出范围值”。 编辑:这个确切的查询在生产SQL服务器上运行良好。 (我使用SSMS运行查询...不是应用程序/代码)

我确定我的笔记本电脑的Windows区域设置与服务器(英语(美国))相同,并且区域和语言控制面板完全相同。

最后我跑了以下两个查询:

select name ,alias, dateformat 
    from syslanguages 
    where langid = 
     (select value from master..sysconfigures 
     where comment = 'default language') 

select @@language 

分别 “英国” 放弃 “*美国英语,英语,MDY *” ......和的结果。这位英国人来自哪里?!现在,当我在查询之前(在管理工作室中)运行此命令时(在管理工作室中)

SET DATEFORMAT mdy 

然后,一切正常!但在syslanguages查询中,它似乎已经是mdy格式。我不打算在整个地方用“SET DATEFORMAT”重写我的应用程序 - 所以希望有人有线索。也许我的SQL Express安装有误,我必须重新安装它?

我会继续修补,希望能够让这个工作。

+0

不知道这是否是一个答案,但另一件事来检查将是数据库的区域设置,而不是服务器及其上做到这一点。可能已决定使用不同的“英文”来存储数据。 – James 2011-04-13 21:59:02

+0

“当我做一个查询试图找到关于”你用什么来做的? SSMS? – 2011-04-13 22:15:29

+0

你将如何检查SQL服务器数据库的区域设置?我可以更改排序规则,但我确定这不相关。 是的 - 我使用SSMS(快速版)来运行这些查询。 – MikeMurko 2011-04-14 00:45:47

回答

2

这是您需要更改的登录的语言设置。

您可以通过SSMS -> Security -> Logins -> YourLogin -> Properties -> Default Language

或者通过TSQL

ALTER LOGIN [YourLogin] WITH DEFAULT_LANGUAGE=[us_english] 
+0

是的,这是它。我只是想出了。我使用SSMS来改变它。愚蠢的StackOverflow不会让我回答我自己的问题,因为我没有足够的代表。 在SQL Server Management Studio中更改此方法的方法是转到SQL Server实例根目录中的“安全”文件夹 - >“登录” - >右键单击某个用户,然后单击“属性” - >然后选择“我”将“默认语言”设置为“英语”。 Kaboom!感谢马丁的帮助! – MikeMurko 2011-04-14 01:03:14

0

如果使用dd-mmm-yyyy格式指定东西,或者更好,请使用DateTime参数(而不是varchar输入),则不会出现问题。

尝试更改默认语言为美国英语,使用下列内容:

EXEC sp_configure 'default language', 1033 
RECONFIGURE 

如果不工作,你可以尝试语言代码0

+0

我尝试了代码0,它只是从0更改为0.对问题没有影响。你的意思是dd-mmm-yyyy格式 - 不只是英国人吗? 我无法使用参数,因为我已经编写了大量的遗留应用程序,所以我不想更改我的查询 - 只需将我的SQL Server配置为相同。 – MikeMurko 2011-04-14 00:47:50

+0

如果您将日期声明为'16 -Apr-2011'或'2011-04-16',那么它是毫不含糊的,SQL服务器将始终做正确的事情。但实际上,你不应该将日期字符串连接到你的SQL中,你应该使用参数并传递类似的日期时间信息。 – 2011-04-14 07:38:25

0

你传递日期为字符串文字 - 或者连接字符串以在应用程序中建立sql?

如果您正在这样做,请考虑使用dateTime数据类型的参数。或者至少使用ODBC转义子句转义它们并将其格式化为{ts'yyyy-mm-ddhh:mm:ss [.fff]'},例如:{ts'1998-09-24 10:02:20' }。

这很可能是您的应用程序未正确传递日期时间。

+0

应用程序中的Concat字符串。但我不认为这是问题,因为我直接将这些查询运行到SQL Server Management Studio中。 我从来没有见过这种逃避条款格式......我会更详细地阅读它。 – MikeMurko 2011-04-14 00:48:51