首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server构建动态日历表

Server构建动态日历表
EN

Stack Overflow用户
提问于 2020-01-15 13:58:31
回答 1查看 763关注 0票数 0

我需要创建一个具有以下条件的财政日历表:

  • 财政年度开始:2019-03-26财政年度结束: 2020-03-25

这些月的期限为下个月的26至25日。例如,下面是该结构的要点:

代码语言:javascript
复制
| Fiscal Year | Month Number | Month Start Date | Month End Date |
|-------------|--------------|------------------|----------------|
| 2019        | 1            | 2019-03-26       | 2019-04-25     |
| 2019        | 2            | 2019-04-26       | 2019-05-25     |
| 2019        | 3            | 2019-05-26       | 2019-06-25     |
| 2019        | 4            | 2019-06-26       | 2019-07-25     |
| 2019        | 5            | 2019-07-26       | 2019-08-25     |
| 2019        | 6            | 2019-08-26       | 2019-09-25     |
| 2019        | 7            | 2019-09-26       | 2019-10-25     |
| 2019        | 8            | 2019-10-26       | 2019-11-25     |
| 2019        | 9            | 2019-11-26       | 2019-12-25     |
| 2019        | 10           | 2019-12-26       | 2020-01-25     |
| 2019        | 11           | 2020-01-26       | 2020-02-25     |
| 2019        | 12           | 2020-02-26       | 2020-03-25     |

这将需要一个滚动的日历,以增加更多的年向前。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-15 14:05:23

您可以使用类似于下面的查询来填充物理表以获得更好的性能。

代码语言:javascript
复制
DECLARE @StartDate DATETIME = '01/01/2015' 
DECLARE @EndDate DATETIME = '12/01/2016' 

    ;WITH OrderedDays as 
    ( 
        SELECT CalendarDate = @StartDate
        UNION ALL 
        SELECT CalendarDate = DATEADD(DAY, 1, CalendarDate)
        FROM OrderedDays WHERE DATEADD (DAY, 1, CalendarDate) <= @EndDate 
    ),
    Calendar AS
    (
        SELECT
            DayIndex = ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY CalendarDate),
            CalendarDate,
            CalenderDayOfMonth = DATEPART(DAY, CalendarDate),
            CalenderMonthOfYear = DATEPART(MONTH, CalendarDate),
            CalendarYear = DATEPART(YEAR, CalendarDate),
            CalenderWeekOfYear = DATEPART(WEEK, CalendarDate),
            CalenderQuarterOfYear = DATEPART(QUARTER, CalendarDate),
            CalenderDayOfYear =  DATEPART(DAYOFYEAR, CalendarDate),
            CalenderDayOfWeek =  DATEPART(WEEKDAY, CalendarDate),
            CalenderWeekday =  DATENAME(WEEKDAY, CalendarDate),
            StartOfMonth =  DATEADD(MONTH, DATEDIFF(MONTH, 0, CalendarDate), 0),
            EndOfMonth = DATEADD (DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, CalendarDate) + 1, 0))
        FROM
            OrderedDays                 
    )
    SELECT 
        FiscalYear = CalendarYear,
        MonthNumber = CalenderMonthOfYear,
        MonthStartDate = MIN(StartOfMonth),
        MonthEndDate = MIN(EndOfMonth) 
    FROM 
        Calendar
    GROUP BY 
        CalendarYear,
        CalenderMonthOfYear
    ORDER BY
        CalendarYear,
        CalenderMonthOfYear

    OPTION (MAXRECURSION 0) 

基于来自Larnu的反馈,下面是一个版本,它使用的是.

代码语言:javascript
复制
DECLARE @StartDate DATETIME = '01/01/2019'
DECLARE @NumberOfDays INT = 10000

;WITH R1(N) AS (SELECT 1 FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    R2(N) AS (SELECT 1 FROM R1 a, R1 b),
    R3(N) AS (SELECT 1 FROM R2 a, R2 b), 
    Tally(Number) AS (SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM R3)

,WithTally AS   
(
    SELECT CalendarDate = DATEADD(DAY,T.Number,@StartDate)
    FROM
        Tally T
    WHERE
        T.Number < @NumberOfDays
)   


,Calendar AS
(
    SELECT
        DayIndex = ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY CalendarDate),
        CalendarDate,
        CalenderDayOfMonth = DATEPART(DAY, CalendarDate),
        CalenderMonthOfYear = DATEPART(MONTH, CalendarDate),
        CalendarYear = DATEPART(YEAR, CalendarDate),
        CalenderWeekOfYear = DATEPART(WEEK, CalendarDate),
        CalenderQuarterOfYear = DATEPART(QUARTER, CalendarDate),
        CalenderDayOfYear =  DATEPART(DAYOFYEAR, CalendarDate),
        CalenderDayOfWeek =  DATEPART(WEEKDAY, CalendarDate),
        CalenderWeekday =  DATENAME(WEEKDAY, CalendarDate),
        StartOfMonth =  DATEADD(MONTH, DATEDIFF(MONTH, 0, CalendarDate), 0),
        EndOfMonth = DATEADD (DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, CalendarDate) + 1, 0))
    FROM
        WithTally                   
)
SELECT 
    FiscalYear = CalendarYear,
    MonthNumber = CalenderMonthOfYear,
    MonthStartDate = MIN(StartOfMonth),
    MonthEndDate = MIN(EndOfMonth) 
FROM 
    Calendar
GROUP BY 
    CalendarYear,
    CalenderMonthOfYear
ORDER BY
    CalendarYear,
    CalenderMonthOfYear

OPTION (MAXRECURSION 0) 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59752953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档