2012-07-25 95 views
5

我有以下程序界面:错误转换数据类型为nvarchar为datetime

Create procedure [dbo].[InsertItemDetails] 
    @TimeItemAdded datetime 

当我打电话这样说:

EXEC [dbo].[InsertItemDetails] 
    @TimeItemAdded = N'20/07/2012 00:00:00'; 

我得到这个错误:

Msg 8114, Level 16, State 5
Error converting data type nvarchar to datetime.

+0

你传递给在'InsertItemDetails'了''@TimeItemAdded参数什么价值? – LittleBobbyTables 2012-07-25 14:08:25

+0

20/07/2012 00:00:00作为日期和时间 – 2012-07-25 14:08:51

回答

10

根据您的区域设置,您传入@TimeItemAdded的参数可能无法识别。

您应该通过日期为:

20120720 
+0

欢呼,问题解决了,我会在9分钟内接受它 – 2012-07-25 14:10:53

+2

这不是一种安全格式。 'SET LANGUAGE FRENCH; SELECT CONVERT(DATETIME,'2012-07-20 00:00:00');'yield'Msg 242,Level 16,State 3,Line 2; La conversion d'un type dedonnéesvarchar en type dedonnéesdatetime acrééune valeur hors limites.' datetime的安全格式是'YYYYMMDD'或'YYYY-MM-DDTHH:MM:SS.nnn' - 'T'很重要。 – 2012-07-25 14:12:05

+0

@AaronBertrand - 迷人;删除时间的一致性 – LittleBobbyTables 2012-07-25 14:12:37

2

使用一个明确的字符串字面量为你的约会。在这种情况下:

EXEC dbo.InsertItemDetails 
    ... 
    , @TimeItemAdded = '20120720'; 

更好的是,确保在您知道日期正确的情况下传递强类型参数。理想情况下,这绝不应该以任何格式呈现为字符串。

区域格式,如M/d/y是坏消息,因为你不能保证他们将工作给用户的会话,日期格式,语言设置,机器上的区域设置等

0

这链接具有所有日期时间格式,它们的内容 http://www.sql-server-helper.com/tips/date-formats.aspx

您可以将它作为varchar传递并使用适当的日期格式代码将其显式转换为日期时间。例如:

SELECT CONVERT(DATETIME, '20/07/2012 00:00:00', 103) 

103是您正在查找的日期时间码。

+1

我不同意你应该将参数更改为varchar。尽可能早地修复格式(或使用正确的数据类型)。如果将参数更改为varchar,则可以传入任何他们想要的内容。例如,“mm/dd/yyyy”会中断; '06/07/2012'将默默存储错误的日期,'07/20/2012'会产生异常。 – 2012-07-25 14:29:21

0

SQL读您的日期7/20/2012这是无效的,你可以用更安全的格式yyyy-MM-dd例如,通过你的约会对象:2012-07-20

相关问题