Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查询SQL时发生日期时间转换错误_C#_Sql Server - Fatal编程技术网

C# 查询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

我在从C到sql Server的sql查询中遇到问题,不确定是什么原因造成的

代码如下所示:

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是用于测试的,我在尝试的很多组合中都出现了错误。