在C#/ ASP.NET中将SQL Server DATETIME与DateTime.NOW进行比较

时间:2018-11-05 15:59:40

标签: c# sql-server datetime

如何将SQL Server DATETIMEDateTime.Now值进行比较?如您所见,我将其分配给一个Session并尝试将其与DateTime.Now进行比较。

string timestamp = @"SELECT sr.*, ud.* FROM SuspensionRecord sr, UserData ud WHERE sr.User_ID=@User_ID AND ud.User_ID=@User_ID";

using (SqlCommand cmd2 = new SqlCommand(timestamp, con))
{
    cmd2.Parameters.AddWithValue("@User_ID", Session["UserID"].ToString());

    using (SqlDataReader dr = cmd2.ExecuteReader())
    {
        if (dr.HasRows)
        {
            while (dr.Read())
            {
                Session["suspensiondate"] = dr["End_Date_Suspension"].ToString();
            }

            if (Convert.ToDateTime(Session["supensiondate"]) >= DateTime.Now.Date)
            {
                lblMessage.Text = "The account's status is suspended.";
                lblMessage.Visible = true;
            }
        }        
    }
}

2 个答案:

答案 0 :(得分:2)

  1. 您应该传递日期并在查询中而不是在c#中进行比较。这少了一步。如果您确实想在c#中使用适当的类型,请不要将DateTime转换为字符串,然后再次将其转换回。
  2. 查询中无需联接(第二张表)
  3. 您不必为此使用DataReader,而可以使用ExecuteScalar来返回1个值。
  4. 使用Add,以便您可以使用SqlDbType而不是AddWithValue指定正确的架构类型
string timestamp = @"SELECT 1 FROM SuspensionRecord sr WHERE sr.User_ID = @User_ID AND supensiondate > @now";
using (SqlCommand cmd2 = new SqlCommand(timestamp, con))
{
    cmd2.Parameters.Add("@User_ID", SqlDbType.Int).Value = Session["UserID"]; // do not convert to string
    cmd2.Parameters.Add("@now", SqlDbType.DateTime).Value = DateTime.Now.Date;
    var result = cmd2.ExecuteScalar();
    if(result != null) // if null then there were no records so account is not suspended
    {
        lblMessage.Text = "The account's status is suspended.";
        lblMessage.Visible = true;
    }
}

答案 1 :(得分:1)

首先,您的SQL很糟糕。
您正在返回太多数据,并且正在使用隐式联接(当显式联接成为ANSI-SQL的一部分已有近30年了!)

第二,Can we stop using AddWithValue() already?

除了所有这些代码,您还可以对SQL进行整个测试并返回一个值:

string sql = 
@"SELECT CASE WHEN EXISTS
  (
      SELECT 1 
      FROM SuspensionRecord 
      WHERE User_ID = @User_ID 
      AND End_Date_Suspension >= CAST(GETDATE() AS DATE)
  ) THEN 1 ELSE 0 END";

然后,您可以使用ExecuteScalar而不是ExecuteReader,并且不需要遍历所有不相关的数据:

using (SqlCommand cmd2 = new SqlCommand(timestamp, con))
{
    cmd2.Parameters.Add("@User_ID", SqlDbType.Int).Value = Session["UserID"];
    if ((int)cmd2.ExecuteScalar() == 1)
    {
        lblMessage.Text = "The account's status is suspended.";
        lblMessage.Visible = true;
    }
}