如何显示那些收费日期已过期的学生,以便他们支付月费?

时间:2014-04-19 19:59:31

标签: c# sql sql-server-2012 vb.net-2010

我正在为我的论文工作,我在其中开发了一个GYM管理系统。我希望软件显示费用支付日期到期的成员(学生),因此他们被告知支付月费。 这些是表定义:

  1. 构件(学生)  中  m_name  m_photo  等
  2. 2.fees
    F_ID
    f_amount
    f_start_date
    f_end_date

    这是C#代码:

    // here i get the current fees id so that the loop should run till it
    SqlCommand getCurrentF_id = new SqlCommand("select IDENT_CURRENT('fees')", con);
    int GotCurrentF_id = Convert.ToInt32(getCurrentF_id.ExecuteScalar());
    int feesId;
    //here is loop to find "select DATEDIFF(day,'f_start_date','getdate())" of all members
    for (feesId = 1; feesId <= GotCurrentF_id; feesId++)
    {
    //here i get the f_start_date from sql server
    SqlCommand f_start_DateCommand = new SqlCommand("select f_start_date from fees where f_id=" + feesId + "", con);
    string f_start_dateCommand1 = Convert.ToString(f_start_DateCommand.ExecuteScalar());
    //finding the date different between f_start_date and now
    SqlCommand dateDiffBetweenNowNdStartDate = new SqlCommand("select datediff(day,'" + f_start_dateCommand1 + "',getdate())", con);
    int finalDateDiff = Convert.ToInt32(dateDiffBetweenNowNdStartDate.ExecuteScalar());
    
    if (finalDateDiff > 30)
    {
        da.SelectCommand = new SqlCommand("select * from members m, fees f where m.m_id=f.m_id and f.f_id="+feesId+"", con);
        da.Fill(ds);
        da.SelectCommand.ExecuteNonQuery();
        dataGridView1.DataSource = ds.Tables[0];
    

    让会员今天支付他的费用,所以他应该没问题。不幸的是,他之前的f_start_date记录将与今天的日期进行比较,并将显示在datagridview中,同一成员将显示为他支付费用的次数。我想将他最新的(当前)f_start_datecurrent_date进行比较,以确定他是否已过期,但不是他以前的费用开始日期,即使他已经支付了。

    我将不胜感激。

1 个答案:

答案 0 :(得分:0)

似乎你想要的东西(取决于日期和成员的反向费用)可以在sql语句中完全处理,所以管理自己只做一个SqlCommand而不是做很多由C#代码处理的查询。

select * 
from 
    members m
    , fees f 
where 
    m.m_id=f.m_id 
    and datediff(day, f.f_start_date, getdate()) > 30

检索链接所有费用的所有会员,但仅限于开始日期超过最近30天(ofc,检索付费费用)。

我不明白将一笔费用作为会员的“最后一笔费用”的条件是什么。

如果设置了f_end_date,如果支付了费用,则可能是:

select * 
from 
    members m
    , fees f 
where 
    m.m_id=f.m_id 
    and datediff(day, f.f_start_date, getdate()) > 30
    and f_end_date is null

如果费用中的费用只是当前支付的费用,那么只按日期管理最后一笔费用:

select * 
from 
    members m
    , ( SELECT m_id,max(f_start_date) as f_start_date
        FROM fees
        GROUP BY m_id) f_lastfees
    ,fees f
where 
    m.m_id=f.m_id 
    and f.m_id = f_lastfees.m_id
    and f.f_start_date = f_lastfees.f_start_date
    and datediff(day, f.f_start_date, getdate()) > 30 

仅检索过去30天内未支付最后费用的会员

如果您需要在sql中提供一些帮助,请在上面注释,但无论如何都要尝试直接检索sql语句中所需的信息,这样可以提高性能并使代码更具可读性。

希望它有所帮助;)

EDITED

新表费用将包含:

f_id
f_amount
f_creation_date --used to know if fee is not paid over last 30days
f_paid_date --used to know if fee is paid or not (equals null if not paid)

最终请求似乎是

select * 
from 
    members m
    ,fees f
where 
    m.m_id=f.m_id 
    and datediff(day, f.f_creation_date, getdate()) > 30 
    and f_paid_date is null

根据费用表上的变更表格,只检索过去30天内没有支付最后费用的商家