这次我需要一个功能,只需选择前12个月。 如果选择2013年12月,则应从2013年11月到2012年11月返回数据。 结果应该显示:
- Year - Month
- 2013 - 11
- 2013 - 10
- 2013 - 09
我之前的问题得到了解答,但我真的不知道如何编辑日期部分只选几个月:
ALTER function [dbo].[LastMonths]
(
@Date datetime
) RETURNS @tbl TABLE (Start datetime, EndDate datetime)
AS
BEGIN
WITH T AS(
SELECT
DATEADD(month, DATEDIFF(month, 0, @Date), 0) AS Start,
DATEADD(d, -DAY(DATEADD(m,1,@date)),DATEADD(m,1,@date)) AS EndDate,
12 Cnt
UNION ALL
SELECT
DATEADD(month, -1, Start),
DATEADD(d, -DAY(DATEADD(m,1,Start-1)),DATEADD(m,1,Start-1)),
Cnt-1
FROM
T
WHERE
Cnt-1>0
)
INSERT INTO @tbl
(Start, EndDate)
SELECT
Start, EndDate
FROM T
RETURN
END
感谢所有善意帮助的人!
答案 0 :(得分:1)
我将查询略微修改为以下内容:
declare @date date = '01 december 2013'
;WITH T AS(
SELECT
DATEADD(month, -1, @date) AS Start,
12 Cnt
UNION ALL
SELECT
DATEADD(month, -1, Start),
Cnt-1
FROM T
WHERE Cnt-1>=0
)
SELECT YEAR(start) [year], MONTH(Start) [month]
FROM t
产生了以下结果:
year month
2013 11
2013 10
2013 9
2013 8
2013 7
2013 6
2013 5
2013 4
2013 3
2013 2
2013 1
2012 12
2012 11
这似乎产生了你想要的结果,但如果不是这样,那么随意发表评论。
答案 1 :(得分:1)
试试这个:
create function [dbo].[LastMonths]
(
@Date datetime
) RETURNS @tbl TABLE (year int, month int)
AS
BEGIN
WITH T AS(
SELECT
dateadd(m, -1, @date) d
UNION ALL
SELECT
dateadd(m, -1, d) d
FROM
T
WHERE
d > dateadd(m, -13, @date)
)
INSERT INTO @tbl
SELECT
year(d), month(d)
FROM T
RETURN
END
测试:
select * from [LastMonths](getdate())
结果:
year month
2013 11
2013 10
2013 9
2013 8
2013 7
2013 6
2013 5
2013 4
2013 3
2013 2
2013 1
2012 12
2012 11
答案 2 :(得分:0)
CREATE FUNCTION [dbo].[PrevMonths] (
@date datetime
)
RETURNS TABLE
RETURN (
SELECT
YEAR( DATEADD(month,delta,@date)) AS [Year],
MONTH(DATEADD(month,delta,@date)) AS [Month]
FROM (VALUES (-1),(-2),(-3),(-4),(-5),(-6),(-7),(-8),(-9),(-10),(-11),(-12)) T(delta)
)