C# 查询SQL时发生日期时间转换错误
我在从C到sql Server的sql查询中遇到问题,不确定是什么原因造成的 代码如下所示:C# 查询SQL时发生日期时间转换错误,c#,sql-server,C#,Sql Server,我在从C到sql Server的sql查询中遇到问题,不确定是什么原因造成的 代码如下所示: SqlCommand cmd = new SqlCommand( "SELECT tscoc_Name, tscoc_Start, tscoc_End FROM tbl_SchedulerOnCall WHERE ( tscoc_Sta
SqlCommand cmd = new SqlCommand(
"SELECT tscoc_Name,
tscoc_Start,
tscoc_End
FROM
tbl_SchedulerOnCall
WHERE (
tscoc_Start > @fd
AND
tscoc_End < @ld)
AND
tscoc_Start = @state",
con);
cmd.Parameters.AddWithValue("fd", SqlDbType.DateTime).Value =
startDate.ToString("yyyy-MM-dd");
cmd.Parameters.AddWithValue("ld", SqlDbType.DateTime).Value =
startDate.AddDays(14).ToString("yyyy-MM-dd");
SQL查询如下所示:
exec sp_executesql
N'SELECT tscoc_Name,
tscoc_Start,
tscoc_End
FROM
tbl_SchedulerOnCall
WHERE (
tscoc_Start > @fd
AND
tscoc_End < @ld)
AND
tscoc_Start = @state',
N'@fd datetime, @ld datetime, @state nvarchar(2)',
@fd = 'Oct 8 2012 12:00:00:000AM',
@ld = 'Oct 22 2012 12:00:00:000AM',
@state = N'SA'
错误是:
从字符串转换日期时间时出现语法错误
有人知道发生了什么吗?您不需要将datetime转换为字符串以将其添加为参数值。只需添加原始DateTime对象本身,.NET SQL代码将完成其余工作。您不需要将DateTime转换为字符串以将其添加为参数值。只需添加原始DateTime对象本身,.NET SQL代码将完成其余的工作。在分配给SqlParameter时,您正在将您的DateTime值转换为字符串,假设startDate在.NET代码中确实是DateTime类型-为什么?那完全是无用的,毫无意义的。。。而且它会导致日期/时间、语言和区域设置方面的潜在问题-正如您所看到的 只需使用:
cmd.Parameters.AddWithValue("fd", SqlDbType.DateTime).Value = startDate;
cmd.Parameters.AddWithValue("ld", SqlDbType.DateTime).Value = startDate.AddDays(14);
然后您就应该没事了。在为SqlParameter赋值时,假设startDate确实是.NET代码中的DateTime类型,那么您正在将DateTime值转换为字符串-为什么?那完全是无用的,毫无意义的。。。而且它会导致日期/时间、语言和区域设置方面的潜在问题-正如您所看到的
只需使用:
cmd.Parameters.AddWithValue("fd", SqlDbType.DateTime).Value = startDate;
cmd.Parameters.AddWithValue("ld", SqlDbType.DateTime).Value = startDate.AddDays(14);
然后你就会没事了。使用。当您的日期采用非标准格式时,这非常有用
string dateString = "Oct 8 2012 12:00:00:000AM";
string format = "MMM dd yyyy hh:mm:ssFFFtt";
CultureInfo provider = CultureInfo.InvariantCulture;
DateTime result = DateTime.ParseExact(dateString, format, provider);
cmd.Parameters.AddWithValue("fd", SqlDbType.DateTime).Value = result;
使用。当您的日期采用非标准格式时,这非常有用
string dateString = "Oct 8 2012 12:00:00:000AM";
string format = "MMM dd yyyy hh:mm:ssFFFtt";
CultureInfo provider = CultureInfo.InvariantCulture;
DateTime result = DateTime.ParseExact(dateString, format, provider);
cmd.Parameters.AddWithValue("fd", SqlDbType.DateTime).Value = result;
你为什么用这个?第二个参数是要传递的值,而不是数据类型
只要做:
SqlCommand cmd = new SqlCommand("SELECT tscoc_Name, tscoc_Start, tscoc_End FROM tbl_SchedulerOnCall WHERE (tscoc_Start > @fd AND tscoc_End < @ld) AND tscoc_Start = @state", con);
cmd.Parameters.AddWithValue("fd", startDate);
cmd.Parameters.AddWithValue("ld", startDate.AddDays(14));
将日期转换为字符串通常是创建bug的第一步。为什么要使用?第二个参数是要传递的值,而不是数据类型
只要做:
SqlCommand cmd = new SqlCommand("SELECT tscoc_Name, tscoc_Start, tscoc_End FROM tbl_SchedulerOnCall WHERE (tscoc_Start > @fd AND tscoc_End < @ld) AND tscoc_Start = @state", con);
cmd.Parameters.AddWithValue("fd", startDate);
cmd.Parameters.AddWithValue("ld", startDate.AddDays(14));
将日期转换为字符串通常是创建错误的第一步。字符串中日期的当前格式是什么?字符串中日期的当前格式是什么?是的,你是对的。这就是测试代码。我发布的sql语句是在我的代码与你的代码相同的时候。是的,你是对的。这就是测试代码。我发布的sql语句是在我的代码与你的代码完全相同的时候。我同意,ToString是用于测试的,我在尝试的很多组合中都出现了错误。我同意,ToString是用于测试的,我在尝试的很多组合中都出现了错误。