【问题标题】:Academic Term Start and End dates学期开始和结束日期
【发布时间】:2017-12-20 20:27:41
【问题描述】:

我在 D_Term 维度中有 1975 至 2020 学年每个学期(春季、夏季、秋季)的学期开始和结束日期。例如:

 2017-01-16  to 2017-05-18  (Spring)   
 2017-06-05 to 2017-08-04  (Summer) 
 2017-08-24  to 2017-12-20  (Fall)

我目前的问题是我需要创建一个弥补表,其中开始和结束术语为: 01/01 至 05/31(春季) 夏季学期为 06/01 至 08/31 秋季学期是 09/01 到 12/31 无论学年是什么,这都需要反映。这个想法是消除连续两个学期之间的 acad 学期结束日期(春季)和 acad 学期开始日期(夏季)之间的差距。

我不知道该怎么做。欢迎任何想法!

谢谢

【问题讨论】:

标签: sql sql-server datetime data-warehouse star-schema


【解决方案1】:

先来一点测试数据:

CREATE TABLE #dates (TermStart DATE, TermEnd DATE, Term VARCHAR(20))
INSERT INTO #dates (TermStart, TermEnd, Term)
VALUES ('2017-01-16','2017-05-18','spring'),
('2017-06-05','2017-08-04','summer'),
('2017-08-24','2017-12-20','fall')

然后解决办法:

SELECT 
    Term
    , TermStart
    , TermEnd
    , NewStart = CASE WHEN LAG(DATEPART(MONTH,DATEADD(DAY,DATEPART(DAY,TermEnd)*-1,DATEADD(MONTH,1,TermEnd)))) OVER (ORDER BY TermStart ASC) = DATEPART(MONTH,TermStart) 
                        THEN DATEADD(MONTH,1,DATEADD(DAY,1,DATEADD(dd,DATEPART(DAY,TermStart)*-1,TermStart)) )
                        ELSE DATEADD(DAY,1,DATEADD(dd,DATEPART(DAY,TermStart)*-1,TermStart)) 
                        END
    , NewEnd = DATEADD(DAY,DATEPART(DAY,TermEnd)*-1,DATEADD(MONTH,1,TermEnd))
FROM #dates

结果:

Term    TermStart   TermEnd     NewStart    NewEnd
------------------------------------------------------
spring  2017-01-16  2017-05-18  2017-01-01  2017-05-31
summer  2017-06-05  2017-08-04  2017-06-01  2017-08-31
fall    2017-08-24  2017-12-20  2017-09-01  2017-12-31

【讨论】:

    【解决方案2】:

    我试过了,效果很好:)

    with cte as
    (
    SELECT 
       New_Academic_Term_Start_DTTM = CASE WHEN Academic_Term_Code like 'SPRING'
                                    then 
          concat(year(Academic_Term_Start_DTTM),'-','01','-','01')
                                    WHEN Academic_Term_Code like 'SUMMER'
                                    then 
          concat(year(Academic_Term_Start_DTTM),'-','06','-','01')
                                    WHEN Academic_Term_Code like 'FALL'
                                    then 
          concat(year(Academic_Term_Start_DTTM),'-','08','-','21')
                                    end 
          from D_Term
    )
    select   
       convert(datetime2(7),New_Academic_Term_End_DTTM,120) as 
      New_Academic_Term_End_DTTM
       from cte
    

    【讨论】: