每月结算系统 - 查询以获取今天尚未缴纳会费的违约者名单

时间:2010-12-05 11:00:55

标签: c# sql-server-2005 sql-server-2008 billing

这是客户表,“C_BillingDay”列表示账单每月到期的日期,例如,如果该值是该客户的截止日期为每月4个月的4天。他必须在4点支付他的会费。

CREATE TABLE [dbo].[Customers](
 [CID] [int] IDENTITY(1,1) NOT NULL,
 [C_Name] [varchar](50) NULL,
 [C_EmailID] [varchar](20) NULL,
 [C_MobileNo] [varchar](20) NULL,
 [C_PhoneNo] [varchar](20) NULL,
 [C_HomeAddress] [varchar](max) NULL,
 [C_ServiceArea] [int] NULL,
 [C_AccountStatus] [int] NULL,
 [C_IPAdress] [varchar](50) NULL,
 [C_MACAddress] [varchar](50) NULL,
 [C_Package] [int] NULL, 
 [C_BillingDay] [int] NULL,
 [Balance] [float] NULL, 
 [C_AccountCreated] [datetime] NULL,
 [C_AccountModified] [datetime] NULL,

付款表:

TABLE [dbo].[Payments](
    [PID] [int] IDENTITY(1,1) NOT NULL,
    [CID] [int] NULL,
    [Amount] [int] NULL,
    [PaymentType] [int] NULL,
    [Details/Comments] [varchar](max) NULL,
    [DateTimeRecieved] [datetime] NULL,
    [DateTimeModified] [datetime] NULL,

请帮我查询今天没有按时缴纳会费的所有违规者......

我一直尝试使用像DATEADD(MONTH,-1,GETDATE())这样的类似函数,但它们没有给出预期的结果:S

select * from Customers,payments 
 where Payments.DateTimeRecieved 
NOT BETWEEN GETDATE() AND DATEADD(MONTH,-1,GETDATE())

2 个答案:

答案 0 :(得分:1)

根据给出的有限系统信息,我怀疑会有两个相关的过程。

第一个日常工作,UPDATE[Balance]根据[Customers][C_Package]中的所有记录执行[C_AccountStatus](可能这表示其他地方存储了月费) ,[C_BillingDay](可能表明它们是否有效),SELECT [CID] FROM [dbo].[Customers] WHERE [Balance] > 0和今天的日期。

完成后,您需要做的就是

SELECT c.[CID] FROM [Customers] c WHERE c.[CID] NOT IN (SELECT p.[CID] FROM [Payments] p WHERE p.[DateTimeRecieved] BETWEEN GETDATE() AND DATEADD(MONTH,-1,GETDATE()))

希望这有帮助。

编辑...

选择尚未付款的客户(虽然逻辑似乎存在缺陷):

{{1}}

(可能有一种更优雅的查询方式!)

答案 1 :(得分:0)

检查余额是否为0以及今天是他们的付款日期怎么样?类似的东西:

从客户中选择*,customers.balance>中的付款0和todays_date> = billdate;

它有点抽象,因为我真的不知道我们正在处理什么语言或你的日期是什么形式。 我也假设他们在缴纳会费时还清了全部余额