这是客户表,“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())
答案 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;
它有点抽象,因为我真的不知道我们正在处理什么语言或你的日期是什么形式。 我也假设他们在缴纳会费时还清了全部余额