SQL server表中表中两个日期列之间的月份

SQL server表中表中两个日期列之间的月份,sql,sql-server,Sql,Sql Server,我有一张桌子,上面有: DocNum, DocDate, DocDueDate, ItemCode and Quantity 现在,我需要在此表中找到Docdate和DocDuedate之间的月份列表,以及所有其他列的详细信息。 例如: DocNum DocDate DocDuedate Itemcode Quantity 10001 20180101 20180509 A0001 100 我需要这样的结果: DocNum Monthdetails Itemcode Q

我有一张桌子,上面有:

DocNum, DocDate, DocDueDate, ItemCode and Quantity
现在,我需要在此表中找到Docdate和DocDuedate之间的月份列表,以及所有其他列的详细信息。 例如:

DocNum  DocDate   DocDuedate Itemcode Quantity
10001   20180101  20180509   A0001    100
我需要这样的结果:

DocNum Monthdetails Itemcode Quantity
10001  20180101     A0001    100
10001  20180201     A0001    100
10001  20180301     A0001    100
10001  20180401     A0001    100
10001  20180501     A0001    100

如何实现这一点?

您需要使用CTE递归编写日历

;WITH CTE(DocNum,DocDate,DocDuedate,Itemcode,Quantity) AS(
   SELECT DocNum,DocDate,DocDuedate,Itemcode,Quantity
   FROM T
   UNION ALL 
   SELECT DocNum,DATEADD(MONTH,1,DocDate) DocDate, DocDuedate,Itemcode,Quantity
   FROM CTE
   WHERE DATEADD(MONTH,1,DocDate) <= DocDuedate
)

SELECT t.DocNum,
      convert(varchar, t.DocDate, 112) as DocDate,
      t.Itemcode,
      t.Quantity
FROM CTE t

sqlfiddle:

另一种方法可以类似于下面的查询,而不使用CTE

select DocNum, Dateadd(month, m.number, docdate) as Monthdetails, Itemcode, Quantity 
from   [TableName] t 
       inner join (
           select distinct number 
            FROM master..[spt_values] 
            where number>=0 and number<1200
           ) m 
               on Dateadd(month, m.number, docdate) between 
                  t.docdate and t.docduedate 

注:上述查询仅适用于100年的日期差,如果您想要更多,您需要增加numbert的值。要澄清,您需要在输入行中的两个日期之间的每月1日有一个输出行?请不要在我的头顶上,我认为您需要一个带有表值函数的交叉应用程序,该函数返回给定日期范围内的行