如何展示那些';的费用日期已过期,因此他们按月支付费用

本文关键字:他们 过期 日期 那些 何展示 | 更新日期: 2023-09-27 17:59:06

我正在为我的论文工作,在论文中我开发了一个GYM管理系统。我希望软件显示那些缴费日期到期的会员(学生),这样他们就可以被告知按月缴费。以下是表格定义:

  1. 成员(学生)m_idm_namem_photoetc

2.费用
f_id
f_金额
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进行比较,看看他是否过期,但不是他之前已经支付的费用开始日期。

如果有任何帮助,我将不胜感激。

如何展示那些';的费用日期已过期,因此他们按月支付费用

您想要的(根据日期和成员的检索费用)似乎可以在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语句中检索所需的信息,这样可以更好地提高性能,并使代码更可读。

希望它能有所帮助;)

编辑

新的餐桌费用将包括:

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天内未支付最后费用的Merber