Показывает, в каком квартале финансового года дата - PullRequest
3 голосов
/ 05 января 2012

Я пытаюсь создать запрос, который отобразит два столбца: один - дату из таблицы, второй - псевдоним, чтобы показать, в какой квартал и финансовый год попадает дата.

К сожалению, мне не хватает знаний SQL, чтобы понять, с чего начать. Я знаю, что я сделал бы это с комбинацией getdate() и dateadd(MONTH,,), однако ничто из того, что я собрал, не приблизилось к работе.

Чтобы еще больше усложнить это, финансовые годы в Австралии начинаются с 1 июля по 30 июня, поэтому первый квартал 2012 финансового года начнется с 1 июля 2012 года.

Я могу сделать это без заявления, но я бы предпочел, чтобы оно было в утверждении, поскольку оно будет использоваться в отчете SSRS и приложении C #, и это значительно упростит обслуживание.

Ответы [ 15 ]

10 голосов
/ 05 января 2012

Это должно работать: -

SELECT
    MyDate,
    CASE
        WHEN MONTH(MyDate) BETWEEN 1  AND 3  THEN convert(char(4), YEAR(MyDate) - 1) + 'Q3'
        WHEN MONTH(MyDate) BETWEEN 4  AND 6  THEN convert(char(4), YEAR(MyDate) - 1) + 'Q4'
        WHEN MONTH(MyDate) BETWEEN 7  AND 9  THEN convert(char(4), YEAR(MyDate) - 0) + 'Q1'
        WHEN MONTH(MyDate) BETWEEN 10 AND 12 THEN convert(char(4), YEAR(MyDate) - 0) + 'Q2'
    END AS Quarter
FROM
    MyTable

Вывод: -

MyDate        Quarter
----------    --------
2011-01-01    "2010Q3"
2011-04-01    "2010Q4"
2011-07-01    "2011Q1"
2011-10-01    "2011Q2"
6 голосов
/ 18 октября 2016

Этот метод не требует оператора CASE и работает для любого ежемесячного финансового календаря.

DECLARE @firstMonthOfFiscalQ1 int = 7; --1=January
SELECT DateColumn
    , FLOOR(((12 + MONTH(DateColumn) - @firstMonthOfFiscalQ1) % 12) / 3 ) + 1 AS FiscalQuarter
    FROM SomeTable 
    WHERE 1=1;
6 голосов
/ 05 января 2012

Я думаю, что было бы проще сделать это с CASE

SELECT
   date
   , CASE
         WHEN MONTH(date) BETWEEN 7 AND 9 THEN 'First Quarter'
         WHEN MONTH(date) BETWEEN 10 AND 12 THEN 'Second Quarter'
         WHEN MONTH(date) BETWEEN 1 AND 3 THEN 'Third Quarter'
         WHEN MONTH(date) BETWEEN 4 AND 6 THEN 'Fourth Quarter'
     END AS quarter
FROM Stuff
4 голосов
/ 05 января 2012

На всякий случай, если вы хотите выполнить какие-то дурацкие математические операции, чтобы избежать оператора case:

select mydate,
   convert(char(4), year(mydate) - (((DATEPART(qq, mydate) - ((DATEPART(qq, mydate) + 1) % 4) + 1) / -4) + 1)) + 
   'Q' + convert(char(1), ((DATEPART(qq, mydate) + 1) % 4) + 1) quar
from sampleData
3 голосов
/ 05 января 2012

Рассмотрите возможность создания эквивалента таблицы измерения даты из хранилища данных.Это будет иметь по одной строке в день на каждый год, который ваши данные могут охватывать (начните с некоторой разумной эпохи и продвиньтесь до некоторой достаточно далекой будущей даты).

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

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

1 голос
/ 16 мая 2019

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

SELECT CHOOSE(MONTH(GetDate()),'3Q','3Q','3Q','4Q','4Q','4Q','1Q','1Q','1Q','2Q','2Q','2Q') AS AccountingQuarter

Команда выбора SQL принимает в качестве параметра месяц даты, а затем выбирает один из 12 доступных параметров. Конечно, большинство других систем начинаются с 1Q / Q1 в первом выборе.

1 голос
/ 04 марта 2014

Я обнаружил, что использование результата ' Взрывные таблетки ' сработало, но я хотел, чтобы мой выглядел как ответ: ' Адам Ральф ', однако я продолжал испытывать ошибки.Я смог обойти это и создал новый CASE пример:

    CASE    -- Results:  2011 (Financial Year )
            WHEN MONTH(MyDate) BETWEEN 1  AND 3  THEN (YEAR(MyDate) - 1)
            WHEN MONTH(MyDate) BETWEEN 4  AND 6  THEN (year(MyDate) - 1)
            WHEN MONTH(MyDate) BETWEEN 7  AND 9  THEN (YEAR(MyDate) - 0)
            WHEN MONTH(MyDate) BETWEEN 10 AND 12 THEN (YEAR(MyDate) - 0)
    END AS FYr,

    CASE    -- Results:  Q4 (Financial Qtr)
            WHEN MONTH(MyDate) BETWEEN 7 AND 9 THEN 'Q1'
            WHEN MONTH(MyDate) BETWEEN 10 AND 12 THEN 'Q2'
            WHEN MONTH(MyDate) BETWEEN 1 AND 3 THEN 'Q3'
            WHEN MONTH(MyDate) BETWEEN 4 AND 6 THEN 'Q4'
    END AS FQtr,

            -- https://stackoverflow.com/a/22170892/2337102
    CASE    -- Results:  2011-Q4  (Financial Yr-Qtr)
            WHEN MONTH(MyDate) BETWEEN 1  AND 3  THEN concat((YEAR(MyDate) - 1), '-', 'Q3')
            WHEN MONTH(MyDate) BETWEEN 4  AND 6  THEN concat((YEAR(MyDate) - 1), '-', 'Q4')
            WHEN MONTH(MyDate) BETWEEN 7  AND 9  THEN concat((YEAR(MyDate) - 0), '-', 'Q1')
            WHEN MONTH(MyDate) BETWEEN 10 AND 12 THEN concat((YEAR(MyDate) - 0), '-', 'Q2')
    END AS FYrQtr,


    CASE    --  Results:  11-Q4   (Financial (short) Yr-Qtr)
            WHEN MONTH(MyDate) BETWEEN 1  AND 3  THEN concat((date_format(MyDate, '%y') - 1), '-', 'Q3')
            WHEN MONTH(MyDate) BETWEEN 4  AND 6  THEN concat((date_format(MyDate, '%y') - 1), '-', 'Q4')
            WHEN MONTH(MyDate) BETWEEN 7  AND 9  THEN concat((date_format(MyDate, '%y') - 0), '-', 'Q1')
            WHEN MONTH(MyDate) BETWEEN 10  AND 12  THEN concat((date_format(MyDate, '%y') - 0), '-', 'Q2')
    END AS FYrQtr,

    CASE    --  Results:  2011-2012/Q4  (Financial Range Yr/Qtr)
            WHEN MONTH(MyDate) BETWEEN 1  AND 3  THEN concat(YEAR(MyDate) - 1,'-', YEAR(MyDate), '/', 'Q3')
            WHEN MONTH(MyDate) BETWEEN 4  AND 6  THEN concat(YEAR(MyDate) - 1,'-', YEAR(MyDate),  '/', 'Q4')
            WHEN MONTH(MyDate) BETWEEN 7  AND 9  THEN concat(YEAR(MyDate) - 0,'-', YEAR(MyDate) + 1,  '/', 'Q1')
            WHEN MONTH(MyDate) BETWEEN 10  AND 12  THEN concat(YEAR(MyDate) - 0,'-', YEAR(MyDate) + 1,  '/', 'Q2')
    END AS FRangeQtr,

    CASE    --  Results:  11-12/Q4  (Financial Range (short) Yr/Qtr)
            WHEN MONTH(MyDate) BETWEEN 1  AND 3  THEN concat((date_format(MyDate, '%y') - 1),'-', (date_format(MyDate, '%y')), '/', 'Q3')
            WHEN MONTH(MyDate) BETWEEN 4  AND 6  THEN concat((date_format(MyDate, '%y') - 1),'-', (date_format(MyDate, '%y')), '/', 'Q4')
            WHEN MONTH(MyDate) BETWEEN 7  AND 9  THEN concat((date_format(MyDate, '%y') - 0),'-', (date_format(MyDate, '%y') + 1), '/', 'Q1')
            WHEN MONTH(MyDate) BETWEEN 10  AND 12  THEN concat((date_format(MyDate, '%y') - 0),'-', (date_format(MyDate, '%y') + 1), '/', 'Q2')
    END AS FRangeQtr2,

Я добавляю свой ответ, надеясь, что он поможет кому-то еще, кто заходит через Google и испытывает проблемы.

0 голосов
/ 17 марта 2018
declare @sdate date='2017-12-01'
declare @edate date='2018-07-01'



;with rs as
(
   select   1 [QNum],@sdate StDT
   union all 
   select [QNum]+1, DATEADD(qq,1,stdt)   from rs where [QNum]<=datediff(qq,@sdate,@edate)
)
select QNum, convert(varchar(10),StDT,105) StDT,convert(varchar(10),dateAdd(m,3,DATEADD(d, -1, DATEADD(qq,DATEDIFF(qq, 0, stdt) + 1, 0))),105)EndDT from rs

--select left(datename(mm,s),3) + ' ' +cast(year(s) as varchar) from rs
0 голосов
/ 17 марта 2018

это может кому-то помочь

declare @dt uddt
select @dt=getdate()


select  case when month(@dt) between 1 and 3 then 'Q4' 
when month(@dt) between 4 and 6 then 'Q1'
when month(@dt) between 6 and 9 then 'Q2'
when month(@dt) between 9 and 12 then'Q3'
end as [Quarter] ,DATEADD(quarter, DATEDIFF(quarter, 0, @dt), 0) 
year_and_first_date_of_quarter,
DATEADD(d, -1, DATEADD(q,DATEDIFF(q, 0, @dt) + 1, 0)) 
year_and_last_date_of_quarter
0 голосов
/ 15 августа 2017

Этот код преобразует дату в год и месяц, то есть начало квартала.

DATEADD(quarter, DATEDIFF(quarter, 0, @date), 0) year_and_first_month_of_quarter

Таким образом, месяцы всегда будут:
ГГГГ- 01 -01
ГГГГ- 04 -01
ГГГГ- 07 -01
ГГГГ- 10 -01
Хорошая вещь - результат в формате datetime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...