如何解决在日期范围之间递归地输入月份名称
我正在尝试根据时间范围将下面的以下列插入#table中。
例如,如果查询在2020年8月运行,则需要它插入 2020年7月-2020年7月的月份名称。
Report_Date_Name| Report_Date_Month| DateYrmo| DateYear| DateMonth|
January 2020| January| 202001| 2020| 1|
February 2020| February| 202002| 2020| 2|
March 2020| March| 202003| 2020| 3|
April 2020| April| 202004| 2020| 4|
May 2020| May| 202005| 2020| 5|
June 2020| June| 202006| 2020| 6|
July 2020| July| 202007| 2020| 7|
________________________________________________________________________________
解决方法
递归CTE似乎很简单:
with dates as (
select datefromparts(year(getdate()),1,1) as dte
union all
select dateadd(month,dte)
from dates
where dte < getdate()
)
select concat(convert(char(12),datename(month,dte)),year(dte)) as report_date_name,dte) as report_date_month,year(dte) * 100 + month(dte) as year_month,year(dte) as year
from dates;
不清楚最后一栏是字符串还是数字。如果是字符串,则将其强制转换为所需的类型。
Here是db 小提琴。
,尝试一下:
DECLARE @SomeDate DATE = '2020-08-08';
WITH Dates ([Date]) AS
(
SELECT DATEADD(MONTH,-[number],'2020-08-08')
FROM
(
SELECT [number] + 1
FROM [master].[dbo].[spt_values]
WHERE [type] = 'P'
) n ([number])
WHERE DATEADD(MONTH,@SomeDate) <= DATEADD(MONTH,-1,@SomeDate)
AND YEAR(DATEADD(MONTH,@SomeDate)) = YEAR(@SomeDate)
)
SELECT CONCAT(DATENAME(MONTH,[Date]),' ',YEAR([Date])) AS [Report_Date_Name],DATENAME(MONTH,[Date]) AS [Report_Date_Month],RIGHT(YEAR([Date]) * 100 + 10000000 + MONTH([Date]),6) AS [DateYrmo],YEAR([Date]) AS [DateYear],MONTH([Date]) AS [DateMonth]
FROM Dates
ORDER BY [Date] ASC;
CTE用于生成当年的每个前一个月的日期。然后,我们使用内置函数来格式化输出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。