我正在为我的论文工作,我在其中开发了一个GYM管理系统。我希望软件显示费用支付日期到期的成员(学生),因此他们被告知支付月费。 这些是表定义:
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_date
与current_date
进行比较,以确定他是否已过期,但不是他以前的费用开始日期,即使他已经支付了。
我将不胜感激。
答案 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语句中所需的信息,这样可以提高性能并使代码更具可读性。
希望它有所帮助;)
新表费用将包含:
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天内没有支付最后费用的商家