Извлечение дат на основе месяцев - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть таблица в базе данных MS SQL, в которой указывается, когда студенты начинают программу. Академический c год длится с августа по июль.

Где студент начинает работу с 1 сентября 2019 года. Я хочу показать, что он начал в 19/20. Если он начнется 6 мая 2020 года, я хочу показать, что он начал в 19/20 Если они начнутся 05 августа 2020 года, я хочу показать, что они начинаются в 20/21

Я пытался сделать это как заявление Case

SELECT 
   LEARNERID
  ,(
    CASE 
      WHEN datepart(MM, LEARNSTARTDATE) BETWEEN 8 AND 12
        THEN datepart(YY, LEARNSTARTDATE)
      END
    ) AS StartYear
  ,(
    CASE 
      WHEN datepart(MM, LEARNSTARTDATE) BETWEEN 1 AND 7
        THEN datepart(YY, LEARNSTARTDATE)
      END
    ) AS EndYear
FROM ILR

Это не работает для меня

Любая помощь с этим будет оценена. Спасибо

Ответы [ 3 ]

2 голосов
/ 17 апреля 2020

Вы можете получить EndYear, добавив к дате 5 месяцев:

select LEARNERID, LEARNSTARTDATE, EndYear - 1 StartYear, EndYear
from (
  select LEARNERID, LEARNSTARTDATE, year(dateadd(month, 5, LEARNSTARTDATE)) EndYear
  from ILR  
) t  

Если вы хотите получить результат в формате XX/XX:

select LEARNERID, LEARNSTARTDATE,
  format((EndYear - 1) % 100, '00') + '/' + format((EndYear) % 100, '00') AcademicYear
from (
  select LEARNERID, LEARNSTARTDATE, year(dateadd(month, 5, LEARNSTARTDATE)) EndYear
  from ILR  
) t 

См. демо . Результаты:

> LEARNERID | LEARNSTARTDATE | AcademicYear
> --------: | :------------- | :-----------
>         1 | 2019-09-01     | 19/20       
>         2 | 2020-05-06     | 19/20       
>         3 | 2020-08-05     | 20/21       
>         4 | 2019-08-01     | 19/20       
>         5 | 2019-07-31     | 18/19    
2 голосов
/ 17 апреля 2020

Я бы сместил дату на 6 месяцев и отформатировал бы ее следующим образом:

format(dateadd(month, -6, learnstartdate), 'yy')
    + '/'
    + format(dateadd(month, 6, learnstartdate), 'yy')

Демонстрация на DB Fiddle :

select  
    learnstartdate, 
    format(dateadd(month, -6, learnstartdate), 'yy')
        + '/'
        + format(dateadd(month, 6, learnstartdate), 'yy') scholar_year
from (values('2019-09-01'), ('2020-05-06'), ('2020-08-05')) t(learnstartdate)
GO
learnstartdate | scholar_year
:------------- | :-----------
2019-09-01     | 19/20       
2020-05-06     | 19/20       
2020-08-05     | 20/21       
1 голос
/ 17 апреля 2020

Опцией может быть CASE...ELSE, с MODULO (%) для получения двух ди git год и CONCAT для обработки преобразования типа данных в строки.

SELECT 
   LEARNERID
  ,LEARNSTARTDATE
  ,CASE 
      WHEN datepart(MONTH, LEARNSTARTDATE) >= 8
        THEN CONCAT(datepart(YEAR, LEARNSTARTDATE) % 100 , '/', datepart(YEAR, LEARNSTARTDATE) % 100 + 1)
      ELSE CONCAT(datepart(YEAR, LEARNSTARTDATE) % 100 -1 , '/', datepart(YEAR, LEARNSTARTDATE) % 100)
    END AS RequestedOutput
FROM 
(
   VALUES (1,'2019-09-01'),(2,'2020-05-06'),(3,'2020-08-20')
) v(LEARNERID,LEARNSTARTDATE);

Результаты :

+-----------+----------------+-----------------+
| LEARNERID | LEARNSTARTDATE | RequestedOutput |
+-----------+----------------+-----------------+
|         1 | 2019-09-01     | 19/20           |
|         2 | 2020-05-06     | 19/20           |
|         3 | 2020-08-20     | 20/21           |
+-----------+----------------+-----------------+

Rextester Demo

...