尝试将日期传递到存储过程,如下所示:
@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。它在发送时似乎将其转换为默认格式,然后在我阅读时将其转换回我的计算机格式。不确定这是怎么发生的,但似乎工作正常。
答案 0 :(得分:3)
当您尝试传递date
(对应于数据库中的string
)时,看起来参数是varchar
(在数据库中)。如果您改为传递.NET DateTime
对象,它应该按预期工作。
答案 1 :(得分:2)
避免头痛并使用明确的日期格式 - 20120428 (YYYYMMDD)
或2012-04-28
。
顺便说一下:你提到你使用C#(基于标签) - 你是如何使用ADO.NET的?或者是Linq to SQL / EF /其他一些ORM?
编辑:
好的,使用CONVERT
函数以及指示日期字符串格式的适当参数
EG:
declare @D datetime
set @D = CONVERT(datetime, '04/28/2012', 101)
print @D
101
是美国标准格式mm/dd/yyyy
。
使用转换将确保它始终可以正常工作,无论任何环境设置如日期顺序。
答案 2 :(得分:1)
如果您拨打set dateformat dmy
,则只会影响当前连接。在将字符串转换为日期之前,您必须每次都设置它。
最好的解决方案可能是ISO格式,就像@IanYates建议的那样。
答案 3 :(得分:1)
亲爱的,您的代码在使用后正在运行 * SET DATEFORMAT dmy 因为你把日期传递为“dd / MM / yyyy” 比如“DateTime.Now.ToString(”dd / mm / yyyy“)”
按照以下命令检查数据库中的日期格式: -
并默认选中“dateformat:mdy”。因此,以“MM / dd / yyyy”格式传递日期也可以正常工作。
快乐编码:)