简体   繁体   English

选择查询两个日期之间不起作用

[英]Select Query between two dates not working

I have this block of code in one form of mine, 我的代码块是我的一种形式,

using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.ConString))
{
    query = "select SUM(TotalMinutes) as TotalMin, SUM(OTMinutes) as OTMin from EmpLog where EmpID = @EmpID and LogDate >= @empdate1 and LogDate <= @empdate2";
    conn.Open();
    using (SqlCommand cmd2 = new SqlCommand(query, conn))
    {
        cmd2.Parameters.AddWithValue("@empdate1", dtp_from.Value.ToString("yyyy-MM-dd"));
        cmd2.Parameters.AddWithValue("@empdate2", dtp_to.Value.ToString("yyyy-MM-dd"));
        cmd2.Parameters.Add(new SqlParameter() { ParameterName = "@EmpID", Value = listBox1.SelectedValue.ToString() });
        var da = new SqlDataAdapter(cmd2);
        DataTable dt = new DataTable();
        da.Fill(dt);             

        decimal decminutes = Convert.ToDecimal(dt.Rows[0]["TotalMin]"].ToString());
        decimal decOTminutes = Convert.ToDecimal(dt.Rows[0]["OTMin"].ToString());

I have made a similar code work on different forms but somehow this won't work. 我已经使类似的代码以不同的形式工作,但是以某种方式却行不通。 I've tried SqlDataReader but it won't even go inside a while reader.read loop. 我已经尝试了SqlDataReader,但它甚至不会进入一会儿reader.read循环。

also upon trying out the query via ssms, it works as expected. 通过ssms尝试查询后,它也会按预期工作。 but if i try other methods such as the sqldatareader, it goes into null exception. 但是,如果我尝试其他方法(例如sqldatareader),它将进入null异常。

EDIT: I've tried removing the WHERE clause from my query, and i'm able to return the rows. 编辑:我尝试从查询中删除WHERE子句,并且我能够返回行。

for some odd reason, the datetimepicker values isn't properly being matched with the values in the database. 由于某些奇怪的原因,datetimepicker值与数据库中的值未正确匹配。 even if when I casted it to string, it exactly matches, but then again, its still returning dbnull. 即使当我将其强制转换为字符串时,它也完全匹配,但是话又说回来,它仍然返回dbnull。

The BETWEEN Keyword BETWEEN关键字

You may want to consider using the BETWEEN keyword within SQL for checking if a value exists in a given range as demonstrated in this SQL example : 您可能要考虑在SQL中使用BETWEEN关键字来检查值是否在给定范围内,如此SQL示例所示:

SELECT SUM(TotalMinutes) AS TotalMin, 
       SUM(OTMinutes) AS OTMin 
  FROM EmpLog 
 WHERE EmpID = @EmpID 
   AND LogDate BETWEEN @empdate1 AND @empdate2"

Avoid Unnecessary Casting 避免不必要的投射

Additionally, you may want to avoid explicitly casting your DateTime values as strings. 此外,您可能要避免将DateTime值显式转换为字符串。 The SQL provider should have no trouble translating those values into their appropriate SQL equivalents. SQL提供程序应该毫不费力地将这些值转换为适当的SQL等效项。

So applying both those changes, should give you something like this : 因此,应用这些更改,应该会给您这样的信息:

using (var conn = new SqlConnection(Properties.Settings.Default.ConString))
{
     conn.Open();
     var query = "SELECT SUM(TotalMinutes) AS TotalMin, SUM(OTMinutes) AS OTMin FROM EmpLog WHERE EmpID = @EmpID AND LogDate BETWEEN @empdate1 AND @empdate2";
     using (var cmd = new SqlCommand(query, conn))
     {
           cmd.Parameters.AddWithValue("@empdate1", dtp_from.Value);
           cmd.Parameters.AddWithValue("@empdate2", dtp_to.Value);
           cmd.Parameters.Add("@EmpID", listBox1.SelectedValue);
           var da = new SqlDataAdapter(cmd2);
           DataTable dt = new DataTable();
           da.Fill(dt);     

           // Other code omitted for brevity
     }        
}

Example Using DataReader 使用DataReader的示例

using (var conn = new SqlConnection(Properties.Settings.Default.ConString))
{
     conn.Open();
     var query = "SELECT SUM(TotalMinutes) AS TotalMin, SUM(OTMinutes) AS OTMin FROM EmpLog WHERE EmpID = @EmpID AND LogDate BETWEEN @empdate1 AND @empdate2";
     using (var cmd = new SqlCommand(query, conn))
     {
           cmd.Parameters.AddWithValue("@empdate1", dtp_from.Value);
           cmd.Parameters.AddWithValue("@empdate2", dtp_to.Value);
           cmd.Parameters.Add("@EmpID", listBox1.SelectedValue);
           using(var reader = cmd.ExecuteReader())
           {
                while(reader.Read())
                {
                     var minutes = Convert.ToDecimal(reader["TotalMin"]);
                     var otMinutes = Convert.ToDecimal(reader["OTMin"]);

                     // Do something here
                }
           }
     }        
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM