0

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

2 回答 2

1

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

第一个每日作业,它根据(也许这表明存储在别处的月费)、(也许表明它们是否处于活动状态)、和今天的日期对所有记录UPDATE[Balance]列执行 an 。[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()))

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

于 2010-12-05T11:16:04.320 回答
0

检查余额是否不为 0 以及今天是他们的付款日期怎么样。就像是:

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

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

于 2010-12-05T11:24:32.090 回答