SQL-在两个日期之间创建自定义日期列表

SQL-在两个日期之间创建自定义日期列表,sql,sql-server,Sql,Sql Server,我在编译查询时遇到问题,无法执行以下操作: 我有一个表,有startDate和endDate[tblPayments] 我有一个列存储特定的paymentDay[tblPayments] 资料 我正在尝试生成一个SELECT查询,该查询将根据这两个日期之间的月数将此特定表拆分为单独的行,并将paymentDay设置为这些查询的日期 示例输出 我发现了一个查询,它将选择这些日期之间的月份,但它会根据上面的表进行调整,并且我正在努力处理多个开始日期和结束日期 分月 此查询仅限于一个startDate

我在编译查询时遇到问题,无法执行以下操作:

我有一个表,有startDate和endDate[tblPayments] 我有一个列存储特定的paymentDay[tblPayments] 资料

我正在尝试生成一个SELECT查询,该查询将根据这两个日期之间的月数将此特定表拆分为单独的行,并将paymentDay设置为这些查询的日期

示例输出

我发现了一个查询,它将选择这些日期之间的月份,但它会根据上面的表进行调整,并且我正在努力处理多个开始日期和结束日期

分月


此查询仅限于一个startDate和endDate,因此我没有将其展开以更改日期日期。

我将创建一个内存中的日历表,然后通过连接到该表执行一个简单的查询:

-- Create a table with all the dates between the min and max dates in the 
-- data table
DECLARE @Calendar TABLE
(
    [CalendarDate] DATETIME
)

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SELECT @StartDate = MIN(startdate), @EndDate = MAX(enddate) FROM YourDataTable

WHILE @StartDate <= @EndDate
BEGIN
    INSERT INTO @Calendar (CalendarDate)
    SELECT @StartDate
    SET @StartDate = DATEADD(dd, 1, @StartDate)
END

-- Join to return only dates between the start and end date that match the Payment Day
SELECT D.PaymentId, C.CalendarDate FROM YourDataTable D
INNER JOIN @Calendar C ON C.CalendarDate BETWEEN D.StartDate AND D.EndDate
AND DATEPART(day, C.CalendarDate) = D.PaymentDay

使用日期表和简单的内部联接

DECLARE @tblPayments table (paymentID int identity(1,1), startDate date, endDate date, paymentDay int)

INSERT @tblPayments VALUES 
  ('2016-01-01', '2016-12-31', 25), 
  ('2015-06-01', '2016-06-30', 16)



;WITH dates AS -- Build date within the range of startDate and endDate
(
    SELECT MIN(startDate) AS Value, MAX(endDate) AS MaxDate FROM @tblPayments
    UNION ALL 
    SELECT DATEADD(DAY, 1, Value), MaxDate 
    FROM dates WHERE DATEADD(DAY, 1, Value) <= MaxDate
)
SELECT pay.paymentID, dates.Value AS expectedDate 
FROM 
    @tblPayments pay 
    INNER JOIN dates ON 
        dates.Value BETWEEN pay.startDate AND pay.endDate 
        AND DAY(dates.Value) = paymentDay
OPTION (maxrecursion 0)

谢谢,这也行得通,我所做的只是用select语句交换INSERT代码,这就获取了整个表的值
declare @start DATE = '2015-01-01'
declare @end DATE = '2015-12-31'

;with months (date)
AS
(
    SELECT @start
    UNION ALL
    SELECT DATEADD(MM,1,date)
    from months
    where DATEADD(MM,1,date)<=@end
)
select Datename(MM,date) from months
-- Create a table with all the dates between the min and max dates in the 
-- data table
DECLARE @Calendar TABLE
(
    [CalendarDate] DATETIME
)

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SELECT @StartDate = MIN(startdate), @EndDate = MAX(enddate) FROM YourDataTable

WHILE @StartDate <= @EndDate
BEGIN
    INSERT INTO @Calendar (CalendarDate)
    SELECT @StartDate
    SET @StartDate = DATEADD(dd, 1, @StartDate)
END

-- Join to return only dates between the start and end date that match the Payment Day
SELECT D.PaymentId, C.CalendarDate FROM YourDataTable D
INNER JOIN @Calendar C ON C.CalendarDate BETWEEN D.StartDate AND D.EndDate
AND DATEPART(day, C.CalendarDate) = D.PaymentDay
DECLARE @tblPayments table (paymentID int identity(1,1), startDate date, endDate date, paymentDay int)

INSERT @tblPayments VALUES 
  ('2016-01-01', '2016-12-31', 25), 
  ('2015-06-01', '2016-06-30', 16)



;WITH dates AS -- Build date within the range of startDate and endDate
(
    SELECT MIN(startDate) AS Value, MAX(endDate) AS MaxDate FROM @tblPayments
    UNION ALL 
    SELECT DATEADD(DAY, 1, Value), MaxDate 
    FROM dates WHERE DATEADD(DAY, 1, Value) <= MaxDate
)
SELECT pay.paymentID, dates.Value AS expectedDate 
FROM 
    @tblPayments pay 
    INNER JOIN dates ON 
        dates.Value BETWEEN pay.startDate AND pay.endDate 
        AND DAY(dates.Value) = paymentDay
OPTION (maxrecursion 0)