日期格式问题SQL Server

时间:2016-02-18 08:36:47

标签: sql-server sql-server-2008 firebird

我有一个使用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

2 个答案:

答案 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()

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

答案 1 :(得分:0)

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

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