两个日期之间的月份SQL服务器表中的表中的列

时间:2018-05-09 03:37:19

标签: sql sql-server

我有一张桌子:

DocNum, DocDate, DocDueDate, ItemCode and Quantity

现在,我需要在此表中找到DocdateDocDuedate之间的月份列表,其中包含所有其他列的详细信息。 例如:

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

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

您需要使用CTE Recursive编写日历

;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:http://sqlfiddle.com/#!18/790b9/7

答案 1 :(得分:0)

另一种方法可能就是在不使用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 

<强> DEMO

注意:以上查询仅适用于100年的日期差异,如果您需要更多,则需要增加数字的值&lt; = 1200