2012-10-10 37 views
1

我有从C# SQL查询问题的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。

任何人有任何想法发生了什么?

+0

什么是您的日期在字符串中的当前格式? –

回答

4

你将你的DateTime值(假设startDate确实是在.NET代码DateTime型)串分配给SqlParameter时 - 什么?这是完全无用的和毫无意义的...它会导致日期/时间,语言和区域设置潜在的问题 - 正如你所看到的...

只需使用:

cmd.Parameters.AddWithValue("fd", SqlDbType.DateTime).Value = startDate; 
cmd.Parameters.AddWithValue("ld", SqlDbType.DateTime).Value = startDate.AddDays(14); 

,然后你应该精细。

+0

是的,你是对的。那是测试代码。我发布的sql语句是当我的代码与你的代码相同时。 – GrantC

1

您不应该需要将日期时间转换为字符串以将其添加为参数值。只需添加原始的DateTime对象本身,而.NET SQL代码将完成剩下的工作。

+0

我同意,ToString用于测试,我尝试了很多组合的错误。 – GrantC

0

使用DateTime.ParseExact。当您在字符串中使用非标准格式的日期时,这很有用。

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; 
0

为什么您使用AddWithValue?第二个参数意味着您想要传递的值,而不是的数据类型。

只要做到:

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)); 

转换日期为字符串通常是第1阶段(在这里)创建一个错误。