我有一个使用Firebird数据库的源第三方系统。您可以设置此第三方系统的Windows服务,以将数据写入SQL Server数据库。最近我得到了以下例外情况:
00:00:40 CallProcessor.exe ## Error ## 22 ## [将varchar数据类型转换为日期时间数据类型导致超出范围的值@ 006D5C65] @:TMSSQLAccess.ExecuteQuery - 异常运行查询:## Threadid:12576 ##
原因一定是我的数据库语言不正确 - 我想。这是我目前的设置:
select @@language
British
查看Firebird的文本数据,我可以看到这样的条目(我编写了一个C#客户端来解析firebird的原始数据):
31/08/2011 16:58:00
这看起来对我来说是正确的(英国格式)。但是,如果我这样做:
select getdate()
我明白了:
2016-02-18 08:18:27.477
所以我对该怎么做有点困惑。请注意,我无法触摸服务器(即更改其语言/时区/日期格式)。但是,我完全控制了SQL Server。
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
答案 0 :(得分:1)
在您的插入语句中,日期为'02/18/16 09:11:24'
- 请注意,该字符串的格式为MM/dd/yyyy
,而不是您怀疑的dd/MM/yyyy
。
因此,您需要将服务器的日期格式更改为MDY
这可以通过将语言设置为us_english
(隐式将日期格式更改为MDY
)或将日期格式直接设置为MDY
来完成。
如果您可以控制insert语句,请使用101
样式作为美国日期格式:
convert(datetime, @datestring, 101) -- will work for @datestring = '02/18/16 09:11:24'
BTW,dates in sql server are not stored with the display format.这就是为什么在执行select getdate()
答案 1 :(得分:0)
如何创建存储过程以插入调用表?您可以接受日期作为字符串(varchar),然后在存储过程中转换为所需的日期时间格式,如下所示:
SELECT @calldateandtime = convert(smalldatetime, @calldateandtime, 103)