【问题标题】:Monthly billing system - query to get list of defaulters who have not paid their dues by today月度计费系统 - 查询以获取到今天尚未缴纳会费的违约者名单
【发布时间】:2010-12-05 11:00:55
【问题描述】:

这是客户表,列“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())

【问题讨论】:

  • 我一直在尝试使用类似的函数,如 DATEADD(MONTH,-1,GETDATE()) 但它们没有给出想要的结果:S

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


【解决方案1】:

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

第一个每日作业在[Balance] 列上根据[C_Package][Customers] 中的所有记录执行UPDATE(可能这表示存储在其他地方的月费),[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()))

(可能还有比这更优雅的查询方式!)

【讨论】:

  • select * from Customers,payments where Payments.DateTimeRecieved NOT BETWEEN GETDATE() AND DATEADD(MONTH,-1,GETDATE())
  • 我想像上面那样做一些事情:S
  • 添加了一个我认为是您所要求的查询。
  • 那么有什么更好的方法来做这样的每月计费,如果我重组数据库,当前的模式已经被使用并且不是我设计的我刚刚添加了付款表,因为客户想要这样的新修改现有系统。顺便说一句,它的 C# 桌面应用程序..
【解决方案2】:

如果余额不为 0 并且今天是他们的付款日期,那该怎么办?比如:

select * from customers, products where customers.balance > 0 and todays_date >= billdate;

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

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    相关资源
    最近更新 更多