t-sql назначает даты учебного года - PullRequest
2 голосов
/ 05 февраля 2009

Я пытаюсь назначить даты отсутствия на учебный год, с 1 августа по 31 июля.

Итак, что бы я хотел:
31/07/2007 = 2006/2007
02/10/2007 = 2007/2008
01.08.2008 = 2007/2008

Есть ли простой способ сделать это на сервере SQL 2000.

Ответы [ 5 ]

6 голосов
/ 05 февраля 2009

вариант с меньшей обработкой строк

SELECT
  AbsenceDate,
  CASE WHEN MONTH(AbsenceDate) <= 7 
    THEN 
      CONVERT(VARCHAR(4), YEAR(AbsenceDate) - 1) + '/' + 
      CONVERT(VARCHAR(4), YEAR(AbsenceDate))
    ELSE 
      CONVERT(VARCHAR(4), YEAR(AbsenceDate)) + '/' + 
      CONVERT(VARCHAR(4), YEAR(AbsenceDate) + 1)
  END AcademicYear
FROM
  AbsenceTable

Результат:

2007-07-31 => '2006/2007' 
2007-10-02 => '2007/2008' 
2008-01-08 => '2007/2008'
1 голос
/ 05 февраля 2009

Я бы предложил создать таблицу календаря. Он будет включать все даты в обозримом будущем (и прошлом) с любой информацией о тех датах, которые вам нужны - например, об учебном году, к которому он относится. Затем вы также можете добавить такие вещи, как праздник или выходной, и т. Д.

Когда вам нужен какой-либо запрос, подобный этому, тогда просто присоединиться к вашей таблице календаря.

1 голос
/ 05 февраля 2009

Может быть, вы могли бы подумать о создании таблицы AcademicYear, примерно так:

CREATE TABLE AcademicYear (
    AcYear   VARCHAR(9)
,   FromDate DATE,
,   ToDate   DATE)

и заполнить его соответственно. Тогда ваш запрос может стать

SELECT
  AbsenceDate,
  AcYear
FROM
  AbsenceTable JOIN AcademicYear ON AbsenceDate BETWEEN FromDate AND ToDate

В качестве дополнительной выгоды, если начало и конец года должны измениться, это изменение данных, а не какой-то ужасный расширенный UDF.

1 голос
/ 05 февраля 2009

Вы можете создать функцию следующим образом:

CREATE FUNCTION dbo.GetAcademicYear(@in DATETIME)
RETURNS VARCHAR(10) AS
BEGIN
    DECLARE @out VARCHAR(10)

    IF (MONTH(@in) > 7)
        SET @out = CAST(YEAR(@in) AS VARCHAR) + '/' + CAST((YEAR(@in) + 1) AS VARCHAR)
    ELSE
        SET @out = CAST((YEAR(@in) - 1) AS VARCHAR) + '/' + CAST(YEAR(@in) AS VARCHAR)

    RETURN(@out)
END

А затем просто назовите это с:

SELECT dbo.GetAcademicYear('31 July 2007')

или

SELECT col1, col2, dbo.GetAcademicYear(date_col) AS academic_year, col3, etc
FROM my_table

и т.д.

1 голос
/ 05 февраля 2009

Должно работать так:

select case 
    when month(AbsenceDate) <= 7 then 
        ltrim(str(year(AbsenceDate) - 1)) + '/' 
               + ltrim(str(year(AbsenceDate)))
        else 
        ltrim(str(year(AbsenceDate))) + '/' 
               + ltrim(str(year(AbsenceDate) + 1))
        end

Пример:

set dateformat ymd
declare @AbsenceDate datetime
set @AbsenceDate = '2008-03-01'
select case 
    when month(@AbsenceDate) <= 7 then 
        ltrim(str(year(@AbsenceDate) - 1)) + '/' 
               + ltrim(str(year(@AbsenceDate)))
        else 
        ltrim(str(year(@AbsenceDate))) + '/' 
               + ltrim(str(year(@AbsenceDate) + 1))
        end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...