日期格式问题 SQL 服务器

Date format issue SQL Server

我有一个使用 Firebird 数据库的第三方源系统。您可以设置此第三方系统的 Windows 服务以将数据写入 sql 服务器数据库。最近我得到这些异常:

00:00:40 CallProcessor.exe##Error##22##[The conversion of a varchar data type to a datetime data type resulted in an out-of-range value@006D5C65] @ :TMSSQLAccess.ExecuteQuery - exception running query : ##Threadid:12576##

原因一定是我的数据库语言不正确 - 我想。这是我当前的设置:

select @@language
British

查看Firebird的文本数据,我可以看到这样的条目(我写了一个C#客户端来解析firebird的原始数据):

31/08/2011 16:58:00

这对我来说是正确的(英式格式)。但是,如果我这样做:

select getdate()

我得到:

2016-02-18 08:18:27.477

所以我有点不知道该怎么做。请注意,我无法访问服务器(即更改其 language/time zone/date 格式)。但是,我可以完全控制 SQL 服务器。

PS:

我刚刚跟踪了一个插入语句,它看起来像这样:

insert into calls (  site, calldateandtime, initial, calltype, callfrom, callto, ring, talk, phone, account, costcurrency, costregion, reason, special, extras, provoiceid, callid, agentid, talkgroup, cost, sourcedate)values ( 1, '02/18/16 09:11:24', 'Y', 2, '102', '4387', 9, 81, '07841269657', '{8D65BD48-5114-4', '£', 4, 0, 1234, '', '', '{522DBFD9-52D9-437A-B254-9498A92A854D}', '{8D65B', '', 0.00, '02/18/16 00:00:00')
go
SET NO_BROWSETABLE ON
go
SELECT SCOPE_IDENTITY() AS newID

go

如何创建一个存储过程以插入调用 table?您可以接受日期作为字符串 (varchar),然后在存储过程中转换为所需的日期时间格式,如下所示:

SELECT @calldateandtime = convert(smalldatetime, @calldateandtime, 103)

在您的插入语句中,日期是 '02/18/16 09:11:24' - 请注意,该字符串的格式为 MM/dd/yyyy,而不是您怀疑的 dd/MM/yyyy
因此,您需要将服务器的日期格式更改为 MDY.
这可以通过将语言设置为 us_english(隐含地将日期格式更改为 MDY)或将日期格式直接设置为 MDY.

来完成

如果您可以控制插入语句,则对美国日期格式使用 101 样式:

convert(datetime, @datestring, 101) -- will work for @datestring = '02/18/16 09:11:24'

顺便说一句, 这就是为什么你在执行 select getdate()

时得到 sql-ansi 标准格式的原因