有两个表,一个用户表,里面有用户名,最后登陆时间等字段,一个消息表,有接收人,发送时间等字段,现在A给B发消息,在发送的页面有一个listbox设置时效天数,假如B登陆时超过A所设置的天数,消息就删除,不知道这个删除语句如何写,主要是时间的判断。
现在在登陆button下更新数据库取得了最后登陆时间,string sql = "update 用户信息表 set 最后登陆时间 = '" + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'where 用户名 = '" + Session["name"] + "'";
        L_database.execsql(sql);
接下来怎么办呢?

解决方案 »

  1.   

    你可以用DATEDIFF来计算两个时间的差值,大于指定天的记录都删除就是了.
    DATEDIFF的用法如下:此示例确定在 pubs 数据库中标题发布日期和当前日期间的天数。USE pubs
    GO
    SELECT DATEDIFF(day, pubdate, getdate()) AS no_of_days
    FROM titles
    GO
      

  2.   

    delete  消息表 where id in 
    (
    select  a.id from 消息表 a  inner join 用户表 b on a.用户名=b.用户名 and   DATEADD(day, a.设置的天数,a.发送时间)>b.登陆时间
    )id 是关键字
      
    *****************************************************************************
    欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) 最新版本:20070212http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
      

  3.   

    我试过了,A用户在当前时间给B发送消息,时效设为1天,然后我把系统时间改为后天,可是B登陆后仍可以看到A发的消息,使什么原因呢,是我哪里没有设置好吗,这是我写的代码,大家帮忙看看那里错了,还是我的数据表的错误呢,两个表中都有id 这个字段。
    protected void Button1_Click(object sender, EventArgs e)
        {
            string sql = "update 用户信息表 set 最后登陆时间 = '" + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'where 用户名 = '" + username .Text  + "'";
            L_database.execsql(sql);
            string sql1 = "delete  消息表 where id in (select  a.id from 消息表 a  inner join 用户信息表 b on a.接收人=b.用户名 and   DATEADD(day, a.时效,a.发送时间)>b.最后登陆时间)";
            L_database.execsql(sql1);
            string L_sql = "select * from 用户信息表 where 用户名 = '" + username.Text + "' and 密码 ='" + userpass.Text + "'";
            DataSet dataSet = new DataSet();
            dataSet = L_database.GetDataSet(L_sql, "userlist");
            if (dataSet.Tables["userlist"].Rows.Count == 0)
            {
                Response.Write("<script>alert(\"用户名不存在或密码错误,请确认后再登录!\");</script>");
            }
            else
            {
                Session["name"] = username.Text;
                Response.Write("<script>alert(\"登录成功!\");</script>");
                
                Response.Redirect("L_main.aspx");
            }
           
        }
        protected void Button2_Click(object sender, EventArgs e)
        {
           
            Response.Redirect("L_userreg.aspx");
        }
    }
      

  4.   

    public void execsql(string strSql)
        {
            OleDbConnection L_dbconn = new OleDbConnection(L_ConnectionString);//定义新的数据连接控件并初始化
            OleDbCommand L_comm = new OleDbCommand(strSql, L_dbconn);//定义并初始化命令对象
            L_dbconn.Close();//关闭连接
            L_dbconn.Open();//打开连接
            L_comm.ExecuteNonQuery();//执行命令
            L_dbconn.Close();//关闭连接
        }
    我把全部代码都贴上了,请大家帮忙找找原因,很着急,谢谢;
      

  5.   

    select DATEADD(day, a.时效,a.发送时间),b.最后登陆时间,a.*,b.* from 消息表 a  inner join 用户信息表 b on a.接收人=b.用户名 看一下数据
      

  6.   

    L_comm.ExecuteNonQuery()报错
    异常详细信息: System.Data.OleDb.OleDbException: 当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式。
      

  7.   

    string conn =  System.Configuration.ConfigurationManager.AppSettings["ConnectionString"].ToString();
        protected void Page_Load(object sender,EventArgs e)
        {
               }
        protected void Button1_Click(object sender, EventArgs e)
        {
            string sql = "update 用户信息表 set 最后登陆时间 = '" + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'where 用户名 = '" + username .Text  + "'";
            L_database.execsql(sql);
            OleDbConnection L_conn = new OleDbConnection(conn);
            L_conn.Open();
            DataSet ds = new DataSet();
            string sql1 = "delete  消息表 where id in (select  a.id from 消息表 a  inner join 用户信息表 b on a.接收人=b.用户名 and   DATEADD(day, a.时效,a.发送时间)>b.最后登陆时间)";        System.Data.OleDb.OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
            dataAdapter.SelectCommand = new System.Data.OleDb.OleDbCommand(sql1, L_conn);
            dataAdapter.Fill(ds, "消息表");
            L_conn.Close();
      

  8.   

    可能是列名的问题
    select DATEADD(day, a.时效,a.发送时间) as 发送时间  ,b.最后登陆时间 from 消息表 a  inner join 用户信息表 b on a.接收人=b.用户名
      

  9.   

    直接连接数据库,还是这个错误,换成原来的sql也不行,郁闷啊,到底是什么地方出错了呢?
      

  10.   

    string conn =  System.Configuration.ConfigurationManager.AppSettings["ConnectionString"].ToString();
        protected void Page_Load(object sender,EventArgs e)
        {
               }
        protected void Button1_Click(object sender, EventArgs e)
        {
            string sql = "update 用户信息表 set 最后登陆时间 = '" + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'where 用户名 = '" + username .Text  + "'";
            L_database.execsql(sql);
            OleDbConnection L_conn = new OleDbConnection(conn);
            L_conn.Open();
            DataSet ds = new DataSet();
            string sql1 = "delete 消息表 where id in (select DATEADD(day, a.时效,a.发送时间) as 发送时间  ,b.最后登陆时间 from 消息表 a  inner join 用户信息表 b on a.接收人=b.用户名 )";
            
            System.Data.OleDb.OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
            dataAdapter.SelectCommand = new System.Data.OleDb.OleDbCommand(sql1, L_conn);
            dataAdapter.Fill(ds, "消息表");
            L_conn.Close();
    没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式。dataAdapter.Fill(ds, "消息表");
      

  11.   

    string sql1  = "delect from 消息表 where id in (select DATEDIFF(day,a.最后登陆时间,a.发送时间)>a.时效 from 消息表a inner join 用户信息表 b on a.接收人= b.用户名)";
    自己写了一个但是报错
      

  12.   

    string sql1 = "delete from 消息表 where id in (select  a.id from 消息表 a  inner join 用户信息表 b on a.接收人=b.用户名 and   DATEADD(day, a.时效,a.发送时间)>b.最后登陆时间)";
      

  13.   

    string sql1 = "delete from 消息表 where id in (select  a.id from 消息表 a  inner join 用户信息表 b on a.接收人=b.用户名 and   DATEADD(day, a.时效,a.发送时间)>b.最后登陆时间)";
    在登陆button下写的,理论上是正确的啊,
      

  14.   

    各位揭帖了,应该是<号啊
    string sql1 = "delete from 消息表 where id in (select  a.id from 消息表 a  inner join 用户信息表 b on a.接收人=b.用户名 and   DATEADD(day, a.时效,a.发送时间)<b.最后登陆时间)";