将日历扩展程序选择日期格式转换为DateTime数据类型会导致超出范围的值

时间:2018-04-24 08:56:59

标签: asp.net sql-server-2008-r2 datetime-format

我试图通过将日历扩展程序选择提供到文本框并从数据库中提取相应的计数来获取特定日期的记录数。 checkdate列的数据类型是DateTime。我们试过了:

protected void Page_Load(object sender, EventArgs e) {
  if (!IsPostBack) {
    string result = "select count(*) from <TableName> where Checkdate= GETDATE() and sub_code=@sub_code";
    SqlCommand cmd = new SqlCommand(result, connection);
    connection.Open();
    Label3.Visible = true;
    Label3.Text = cmd.ExecuteScalar().ToString();
    connection.Close();
  }
}

protected void Button1_Click(object sender, EventArgs e) {
  Label5.Visible = true;

  Label3.Visible = true;

  string query = "select count(*) from <TableName> where Checkdate= @checkdate and sub_code=@sub_code";

  SqlCommand cmd = new SqlCommand(query, connection);
  cmd.Parameters.AddWithValue("@checkdate", tbdate.Text);
  connection.Open();

  Label5.Text = cmd.ExecuteScalar().ToString();

  connection.Close();
}

但我收到以下错误: 将nvarchar数据类型转换为日期时间数据类型会导致超出范围的值。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Data.SqlClient.SqlException:将nvarchar数据类型转换为日期时间数据类型会导致超出范围的值。

来源错误:

第125行:connection.Open(); 第126行: 第127行:Label5.Text = cmd.ExecuteScalar()。ToString(); 第128行: 第129行:connection.Close();

DB中存储的日期格式为:2018-04-24 12:00:22.803

2 个答案:

答案 0 :(得分:0)

这里至少有两个问题。

首先,在按钮点击事件中,您有

cmd.Parameters.AddWithValue("@checkdate", tbdate.Text);

这是将日期的视觉(文本)表示作为文本字符串放入参数中 - 您需要将日期作为日期,而不是文本显示。这就是您收到转换错误的原因。对您的问题的评论对此进行了讨论,因此可能已经修复了。

其次,在两个SQL查询中,您没有正确检查日期,这就是您获得零计数的原因。在按钮单击查询中,您有“Checkdate = @checkdate”。你说checkdate是一个日期时间,示例中的时间部分为12:00。来自该计划的日期没有时间段,(或者实际上它的时间是00:00),所以你不会匹配。您需要检查checkdate的日期部分,例如“CAST(Checkdate as date)= @checkdate”。

在页面加载中,您有相同的问题,但在两边;你有“Checkdate = GETDATE()”。 Getdate也返回一个时间,因此您不会加载任何未创建的页面加载时相同的毫秒。你需要“在哪里演员(Checkdate as date)= Cast(GETDATE()as date)”

答案 1 :(得分:0)

我设法通过以下方法解决问题,我只是将获取日期的日期部分保存为:checkdate = convert(date,GETDATE()) 然后像这样称呼它:

  SqlCommand cmd = new SqlCommand(query, connection); 
  string textboxdate = tbdate.Text;
            DateTime lastdate = DateTime.ParseExact(textboxdate,
                       "dd/MM/yyyy",
                       System.Globalization.CultureInfo.InvariantCulture);

            string newFormat = lastdate.ToString("yyyy-MM-dd");
            cmd.Parameters.AddWithValue("@checkdate", newFormat);

           connection.Open();


            Label5.Text = cmd.ExecuteScalar().ToString();

            connection.Close();