查询SQL时的DateTime转换错误

时间:2012-10-10 07:05:04

标签: c# sql-server

我遇到从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的语法错误。

任何人都知道发生了什么事?

4 个答案:

答案 0 :(得分:4)

您正在将DateTime值(假设startDate 确实在.NET代码中类型为DateTime)转换为字符串,以便分配给{ {1}} - 为什么?这完全没用,毫无意义......它会导致日期/时间,语言和区域设置等潜在问题 - 正如您所看到的那样......

只需使用:

SqlParameter

然后你应该没事。

答案 1 :(得分:1)

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

答案 2 :(得分: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;

答案 3 :(得分: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));

将日期转换为字符串通常是创建错误的第一步(如此处所示)。