【问题标题】:get values based on date time根据日期时间获取值
【发布时间】:2013-05-26 09:33:46
【问题描述】:

我想要实现的是:-

1- 从数据库中获取当前日期(今天)的记录。 2-如果数据库没有今天的记录,我希望它从前一天得到它。 3-如果前一天没有任何记录,我希望它从前一天获取它们,依此类推。

try
    {
        string date = DateTime.Now.ToShortDateString();
        conn.Open();
        //string str = "insert into Table1 (title , date_ ,www, cat) values  (' " + TextBox1.Text + "','" + DateTime.Now.ToShortDateString() + "','" + TextBox2.Text + "','" + DropDownList1.SelectedItem.Text + "')";
        ////string str = "INSERT INTO Table1  (title,date_,www ) values ('ddddddd','aaaaaaa','qqqqqq')";


        string str =

            //"SELECT   from table1  WHERE  cat = 1 and datee='" + date + "'ORDER BY datee";
        "SELECT * FROM table1 WHERE cat = 1 and datee = @dt ORDER BY datee DESC ";



        SqlCommand objcmd = new SqlCommand(str, conn);

        objcmd.Parameters.AddWithValue("@dt", date);

        SqlDataAdapter da1 = new SqlDataAdapter(objcmd);


        DataTable dt = new DataTable();

        da1.Fill(dt);




        //DataRow dr = new DataRow();
        //DataRow dr = ds.Tables[0].Rows[0];

        int id = 1;
        foreach (DataRow dr in dt.Rows)
        {
            if (id == 1)
            {
                    ll1.Text = dr[1].ToString();
                    l1.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";


            }
            if (id == 2)
            {
                ll2.Text = dr[1].ToString();
                l2.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 3)
            {
                ll3.Text = dr[1].ToString();
                l3.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 4)
            {
                ll4.Text = dr[1].ToString();
                l4.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 5)
            {
                ll5.Text = dr[1].ToString();
                l5.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 6)
            {
                ll6.Text = dr[1].ToString();
                l6.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 7)
            {
                ll7.Text = dr[1].ToString();
                l7.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 8)
            {
                ll8.Text = dr[1].ToString();
                l8.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 9)
            {
                ll9.Text = dr[1].ToString();
                l9.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 10)
            {
                ll10.Text = dr[1].ToString();
                l10.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 11)
            {
                ll11.Text = dr[1].ToString();
                l11.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 12)
            {
                ll12.Text = dr[1].ToString();
                l12.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 13)
            {
                ll13.Text = dr[1].ToString();
                l13.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 14)
            {
                ll14.Text = dr[1].ToString();
                l14.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 15)
            {
                ll15.Text = dr[1].ToString();
                l16.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 16)
            {
                ll16.Text = dr[1].ToString();
                l16.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 17)
            {
                ll17.Text = dr[1].ToString();
                l17.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 18)
            {
                ll18.Text = dr[1].ToString();
                l18.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 19)
            {
                ll19.Text = dr[1].ToString();
                l19.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 20)
            {
                ll20.Text = dr[1].ToString();
                l20.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 21)
            {
                ll21.Text = dr[1].ToString();
                l21.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 22)
            {
                ll22.Text = dr[1].ToString();
                l22.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 23)
            {
                ll23.Text = dr[1].ToString();
                l23.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            if (id == 24)
            {
                ll24.Text = dr[1].ToString();
                l24.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
            }
            id = id + 1;
        }
    }
    catch (Exception ex)
    {
        lblError.Text = "فشل في إحظار الأخبار";
    }
    finally
    {
        conn.Close();
    }
}

【问题讨论】:

  • date before 是否表示要获取所有数据。请澄清。
  • llx 和 lx 确实需要是数组。你的代码可以这样放在一页上,并且更具可读性。
  • @saravanan 是的,如果没有今天的数据,则为前一天的所有数据
  • @coderoaq:您可以通过 2 种方式进行尝试,运行查询并获取日期的数据。如果没有得到,重新运行另一个查询并获取之前的数据。否则,您可以使用 SP 在数据库端完成工作。如果没有日期输入,您可以将其从过滤子句中删除,从而获取所有数据,而不仅仅是今天的数据。
  • 如果之前的日期也是空的怎么办?

标签: c# asp.net sql database


【解决方案1】:
   int id = 1;//???????
    foreach (DataRow dr in dt.Rows)
    {
        if (id == 1)//???????
        {
                ll1.Text = dr[1].ToString();
                l1.ImageUrl = @"photo\" + dr[1].ToString() + @".jpg";
        }

您总是检查 ID 是否为 ID=1 而不是使用这个:

if ( dr[1] == id)
{
...
}
id++
.
.
.

【讨论】:

    【解决方案2】:

    我建议您更新您的 SQL 查询以完成您的工作并避免 2 次数据库命中,您可以这样做:

    string str = 
        "SELECT * FROM table1 WHERE cat = 1 and datee = @dt ORDER BY datee DESC " +
        "UNION SELECT * FROM table1 WHERE cat = 1 and datee < @dt AND (SELECT COUNT(*) FROM table1 WHERE cat = 1 and datee = @dt) = 0 ORDER BY datee DESC";
    

    如果这些结果的计数为 0,您可以看到我将日期之前的所有结果加入到结果中(这意味着如果没有选择任何内容,则选择该日期之前的那些)

    【讨论】:

    • 更好的是,将查询封装为存储过程。如果您的查询暴露给外界,您就有可能遭受注入攻击:CREATE PROC myOlderDateCat @ParamLastDate AS 以上选择。也不要使用 select *,只返回你想要的行。将其拖入 LinqToDB 类。将其绑定到网格,几乎所有工作都会为您完成。
    【解决方案3】:

    这里有一些代码可以获取整个第一天中包含任何行的所有项目(按时间倒退)。这假设 SQL Server 2005 或更高版本(您没有说明您使用的是什么 DBMS 和版本,请说明!):

    WITH Data AS (
       SELECT TOP 1 WITH TIES
          *
       FROM dbo.table1
       WHERE
          cat = 1
          AND datee >= DateAdd(day, -5, @dt)
       ORDER BY
          Convert(date, datee) DESC
    )
    SELECT *
    FROM Data
    ORDER BY datee DESC
    ;
    

    如果您可以在前端对行进行排序(并且您可能应该),那么您就不需要额外的外部查询。使用这种TOP 1 WITH TIES 语法,您不能向内部ORDER BY 子句添加更多表达式,因为这会改变选择的内容。

    您还应该只选择所需的列而不是表中的所有内容。

    【讨论】:

      猜你喜欢
      • 2013-05-19
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多