首页 > 解决方案 > 在 C# / ASP.NET 中将 SQL Server DATETIME 与 DateTime.NOW 进行比较

问题描述

如何将 SQL ServerDATETIMEDateTime.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;
            }
        }        
    }
}

标签: c#sql-serverdatetime

解决方案


  1. 您应该传入日期并在查询中而不是在 C# 中进行比较。那是少了一步。如果您确实想在 c# 中执行此操作,请使用适当的类型,不要将其转换DateTime为字符串,然后再将其转换回来。
  2. 查询中不需要连接(第二个表)
  3. 您不必为此使用 DataReader,您可以使用返回 1 值的ExecuteScalar 。
  4. 使用以便您可以使用SqlDbTypeAdd指定正确的架构类型,而不是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;
    }
}

推荐阅读