我正在尝试创建一个函数,我可以给它任何日期,它可以返回特定资产的计费日期范围。
例如,下面我有一个AssetBilling
表格示例,它告诉我应该根据开始日期对资产计费的频率。
如果我给函数一个日期:25/02/2021
对于资产Red Car
,它应该告诉我它所属的计费周期是:FROM 01/02/2021
TO01/03/2021
我已经尝试了以下 CTE,但我不完全确定如何使用它,因为我以前没有这样做过:
DECLARE @InvDate AS DATE = '25/02/2021',
@ID AS INT = 1 -- Red Car example
;WITH CTE AS (
SELECT StartDate, DATEADD(MM, Frequency, StartDate) EndDate
FROM AssetBilling WHERE ID = @ID
UNION ALL
SELECT DATEADD(MM, 1, StartDate), DATEADD(MM, 1, EndDate)
FROM CTE
WHERE
StartDate >= @InvDate AND EndDate <= @InvDate
)
SELECT *
FROM
CTE
CREATE TABLE [dbo].[AssetBilling](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Asset] [varchar] (150) NULL,
[StartDate] [date] NULL,
[Frequency] [int] NULL,
[BillType][varchar](50)NULL
);
INSERT INTO AssetBilling
(Asset, StartDate, Frequency, BillType)
VALUES
('Red Car', '01/01/2021', 1, 'Monthly'),
('Blue Car', '25/05/2021', 3, 'Quarterly')
我不相信您在这里需要递归 CTE,但对于 Larnu 的观点,请说明当频率不是每月时您想要发生的事情(修改此查询以支持我需要准确了解您在每季度一次时想要什么例如,提供的 InvDate 是该期间的第 2 个月或第 3 个月)。
DECLARE @InvDate date = '20210225', -- avoid regional, ambiguous formats
@ID int = 1;
;WITH src(StartDate, Frequency) AS
(
SELECT DATEADD(MONTH,
DATEDIFF(MONTH, StartDate, @InvDate), StartDate), Frequency
FROM dbo.AssetBilling -- always use schema prefix
WHERE ID = @ID
)
SELECT StartDate, EndDate = DATEADD(MONTH,Frequency,StartDate)
FROM src;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句