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日有一个输出行?请不要在我的头顶上,我认为您需要一个带有表值函数的交叉应用程序,该函数返回给定日期范围内的行