Динамический SQL только для дат текущего финансового года - PullRequest
2 голосов
/ 30 января 2012

У меня есть база данных, которая содержит две даты, которые меня интересуют.

StartDate + EndDate

Эти даты хранятся в следующем формате:

2008-06-23 00:00:00.000

Мне нужно добавить фрагмент динамического SQL, чтобы вернуть только даты, которые выпадают на текущий финансовый год.

так, например, 01/04/2011 - 31 марта 2012 года будет этот финансовый год.

Поэтому любая запись, конечная дата которой находится в пределах этих дат или имеет значение NULL, классифицируется как «активная»

Часть года должна быть динамичной, чтобы, как только она наступила 1 апреля 2012 года, мы перешли в новый финансовый год и возвращали данные с 01/04/2012 по 31/03/13 и так далее.

Может предложить какой-нибудь код или указать какие-то правила, которые я пропустил?

Ответы [ 3 ]

3 голосов
/ 30 января 2012

Попробуйте:

...
where StartDate >= 
    case 
        when month(getdate()) > 3 
            then convert(datetime, cast(year(getdate()) as varchar) + '-4-1')
        else 
            convert(datetime, cast(year(getdate()) - 1 as varchar) + '-4-1')
    end 
and (EndDate is null or EndDate < 
    case 
        when month(getdate()) > 3 
            then convert(datetime, cast(year(getdate()) + 1 as varchar) + '-4-1')
        else 
            convert(datetime, cast(year(getdate()) as varchar) + '-4-1')
    end)
2 голосов
/ 23 февраля 2012

Вот и мы:)

Динамическое решение,

DECLARE @MyDate DATETIME
SET @MyDate = getDate()

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME

SET @StartDate = DATEADD(dd,0, DATEDIFF(dd,0, DATEADD( mm, -(((12 + DATEPART(m, @MyDate)) - 4)%12), @MyDate ) - datePart(d,DATEADD( mm, -(((12 + DATEPART(m, @MyDate)) - 4)%12),@MyDate ))+1 ) )
SET @EndDate = DATEADD(ss,-1,DATEADD(mm,12,@StartDate ))

SELECT @StartDate,@EndDate
1 голос
/ 30 января 2012

Создание справочной таблицы Finacial_Year, содержащей поля financial_year_start и financial_year_end.

Заполните его данными за следующие 50 лет (это легко сделать с помощью электронной таблицы для расчета дат).

Присоедините вашу таблицу к таблице поиска, используя enddate

SELECT ...
FROM Your_Table LEFT JOIN Financial_Year
ON Your_Table.enddate BETWEEN Financial_Year.financial_year_start
    AND Financial_Year.financial_year_end
WHERE Your_Table.enddate IS NULL -- Active 
    OR (getdate() BETWEEN Financial_Year.financial_year_start
    AND Financial_Year.financial_year_end)

Текущий финансовый результат будет меняться автоматически, когда текущая дата попадает между следующими двумя датами.

Кстати, финансовый год в Великобритании длится с 06-04-YYYY по 05-04-YYYY, а не с 1-го по 31-е.

...