2012-04-28 51 views
2

试图日期传递到一个存储过程如下:不能通过日将存储过程

@dateRegistered = '28/04/2012' 

但它总是告诉我:

错误转换数据类型为varchar日期。

如果我这样做,因为它的工作原理:

@dateRegistered = '04/28/2012' 

但是,这不是我想要使用的格式。

我已经运行下面的查询来设置格式:

SET DATEFORMAT dmy 

为什么不工作?

编辑:这是我如何做的:

在我的存储过程,我把:

SET DATEFORMAT dmy 

然后从代码,我把它作为:

myCommand.Parameters.Add("@dateRegistered", SqlDbType.Date); 
myCommand.Parameters["@dateRegistered"].Value = DateTime.Now.ToString("dd/mm/yyyy"); 

我通过它作为字符串来确保即使我的电脑(或服务器)具有不同的日期格式,它也将始终使用dmy。

编辑编辑:

我通过它作为datetime.now。当我发送它时,它似乎将其转换为默认格式,然后在读取它时将其转换回我的计算机格式。不确定这是怎么发生的,但它似乎工作正常。

+1

“我通过它作为字符串以确保即使在我的电脑(或服务器)具有不同的日期格式,它总是使用DMY”。 ** NO,NO,NO **将它作为DateTime传递--.NET库知道如何将.NET的datetime概念转换为SQL概念,并且不需要考虑任何字符串格式或含糊不清的问题。 – 2012-04-28 11:26:01

回答

3

看起来参数是date(在数据库中),而您尝试通过string(对应于数据库中的varchar)。如果您改为传递.NET DateTime对象,它应该按预期工作。

+0

那么如何在sql管理工作室中传递日期? (用于测试) – TheGateKeeper 2012-04-28 10:56:59

+0

@TheGateKeeper在你的情况下,你可以尝试'convert(datetime,'04/28/2012',101)'(假设你正在使用SQL Server)。我不是SQL Server主服务器,所以可能有更好的方法。 – 2012-04-28 11:04:56

+0

如果这个答案是正确的,它也会失败的月份优先格式,但它不 – Andomar 2012-04-28 11:06:09

2

节省您的头痛,并使用明确的日期格式 - 20120428 (YYYYMMDD)2012-04-28。另外:你提到你正在使用C#(基于标签) - 你如何使用ADO.NET?或者是Linq到SQL/EF /一些其他的ORM?

编辑:

好,使用CONVERT函数说明你的日期字符串

EG的格式适当的参数:

declare @D datetime 
set @D = CONVERT(datetime, '04/28/2012', 101) 
print @D 

101是美国的标准格式mm/dd/yyyy

使用转换将确保它始终工作,无论任何环境设置如日期顺序。

+0

它似乎从代码工作时,我通过一个数据时间对象......但我想能够测试它从SQL Management Studio也是如此。顺便说一句,我不想​​使用(YYYYMMDD)格式。 – TheGateKeeper 2012-04-28 11:02:07

+1

'2012-04-28'在SQL Server中不起作用,对于'datetime',如果你有'british'语言集。 ('20120428'确实) – 2012-04-28 11:13:03

+0

你可以请检查如果我做得对吗?我更新了这个问题。 – TheGateKeeper 2012-04-28 11:24:09

1

如果您致电set dateformat dmy,那只影响当前连接。在将字符串转换为日期之前,您必须每次都设置它。

最好的解决方案可能是ISO格式,就像@IanYates所建议的那样。

+0

因此,它不是您为数据库设置的一次?我必须在每次传递参数时设置它? – TheGateKeeper 2012-04-28 11:16:52

+0

或更好的,传递一个日期时间'myCommand.Parameters [“@ dateRegistered”]。Value = DateTime.Now;' – Andomar 2012-04-28 11:31:49

+0

你能解释一下如何使用ISO格式?如果我打电话给DateTime.Now不会这会返回指定给计算机的格式的日期? – TheGateKeeper 2012-04-28 11:38:28

1

亲爱的你的代码是使用后的工作 * SET DATEFORMAT DMY 因为你逝去的日期为 “DD/MM/YYYY” 像 “DateTime.Now.ToString(” DD/MM/YYYY “)”

检查通过以下命令在数据库中的日期格式: -

  • DBCC USEROPTIONS

,并检查“datefo rmat:mdy“。所以以“MM/dd/yyyy”格式传递你的日期也可以。

编码快乐:)