【问题标题】:DateTime conversion error when querying SQL查询SQL时日期时间转换错误
【发布时间】:2012-10-10 16:13:42
【问题描述】:

我在从 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'

错误是:

从字符串转换日期时间的语法错误。

有人知道发生了什么吗?

【问题讨论】:

  • 当前日期的字符串格式是什么?

标签: c# sql-server


【解决方案1】:

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

只需使用:

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

然后你应该没事。

【讨论】:

  • 是的,你是对的。那是测试代码。我发布的 sql 语句是当我的代码与你的代码相同时。
【解决方案2】:

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

【讨论】:

  • 我同意,ToString 是用来测试的,我尝试了很多组合都出现错误。
【解决方案3】:

使用 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;

【讨论】:

    【解决方案4】:

    为什么你使用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));
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-31
      • 2020-12-01
      • 2015-06-17
      • 2013-04-20
      • 1970-01-01
      • 2017-11-01
      • 2011-07-29
      相关资源
      最近更新 更多