gpt4 book ai didi

sql-server - 我需要一个给定日期范围的动态月份列表(第一天和最后一天),SQL Server

转载 作者:行者123 更新时间:2023-12-02 01:24:59 25 4
gpt4 key购买 nike

如果 @EndDate 设置为 2015 年内的任何值,我下面的代码就可以工作,但是当它是一个超出 @StartDate 日历年的日期时,它会在 12-31-2015 停止。有人可以帮我吗,我希望能够使用它来获取用户定义的日期范围之间的所有月份。

DECLARE @StartDate DATE
DECLARE @EndDate DATE


set @StartDate = '1/1/2015'
set @EndDate = '12/31/2016'



SELECT
cast(dateadd(m, month-1, @StartDate) as date) begin_month,
cast(dateadd(m, month, dateadd(year, datediff(year, 0, @StartDate), -1)) as date) end_month
FROM (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) x(month)
WHERE
cast(dateadd(m, month-1, @StartDate) as date) >= @StartDate
and
cast(dateadd(m, month, dateadd(year, datediff(year, 0, @EndDate), -1)) as date) <= @EndDate

最佳答案

你快到了。不要只使用 12 行,而要尝试使用更多行。在这里,我创建了一个最多 10,000 行的理货表。然后,使用 TOP 来限制行数,具体取决于 DATEDIFF(MONTH, @StartDate, @EndDate) + 1。有了它,您不再需要添加 WHERE 子句:

DECLARE @StartDate  DATE,
@EndDate DATE

SELECT @StartDate = '20150101',
@EndDate = '20161231'

;WITH E1(N) AS( -- 10 ^ 1 = 10 rows
SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N)
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows
CteTally(N) AS(
SELECT TOP(DATEDIFF(MONTH, @startDate, @endDate) + 1)
ROW_NUMBER() OVER(ORDER BY(SELECT NULL))
FROM E4
)
SELECT
begin_month = DATEADD(MONTH, N-1, @startDate),
end_month = DATEADD(DAY, -1, DATEADD(MONTH, N, @startDate))
FROM CteTally

ONLINE DEMO

关于sql-server - 我需要一个给定日期范围的动态月份列表(第一天和最后一天),SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37738733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com