2012-01-02 2 views
17

Ниже перечислены Quarters для финансового годаКак я открыть четверть указанной даты

April to June   - Q1 
July to Sep   - Q2 
Oct to Dec    - Q3 
Jan to March   - Q4 

Если месяц с даты ввода лежит как указано выше, мне нужен выход для с точки зрения количества Quarter.

Например,

Если я дам дату ввода (скажем 2 января), мне нужно вывод как Q4.

Если я даю ввод как (Jun 5), выход должен указывать Q1.

Основанный на дате ввода мне нужен номер четверти.

+0

Можете ли вы сделать это с нуля, существует ли встроенная библиотека или нет? –

+0

Связанная ветка - http://stackoverflow.com/questions/1947191/nearest-completed-quarter – adatapost

+0

@AVD: Вышеупомянутый поток не совпадает с ожидаемыми промежутками результатов номера четверти для любой введенной даты. – venkat

ответ

18

Вы можете просто написать метод

public static int GetQuarter(DateTime date) 
{ 
    if (date.Month >= 4 && date.Month <= 6) 
     return 1; 
    else if (date.Month >= 7 && date.Month <= 9) 
     return 2; 
    else if (date.Month >= 10 && date.Month <= 12) 
     return 3; 
    else 
     return 4; 
} 
+0

Спасибо за ваш метод. Если вышеприведенный метод возвращает «4» в качестве выходного для январского месяца, тогда мне нужен вывод с некоторым дополнительным усилием как Q4, Q1, Q2, Q3. Просто вращение этих кварталов в порядке, основанном на месяце datetime. Как я могу получить? – venkat

+0

Харис: Пожалуйста, вы можете прочитать мой предыдущий комментарий. – venkat

+0

Ваше требование не ясно для меня с вашим комментарием. Можете ли вы объяснить или лучше разместить его в другом вопросе? Вышеупомянутый фрагмент кода отвечает на ваш текущий вопрос –

11

это для "нормального года" Я думаю, что вы можете адаптировать образца

String.Format ("Q {0}", (date.Month + 2)/3);

+0

Простой, но эффективный! –

3

в SQL, это просто

((((month(@mydate)-1)/3)+3) % 4) + 1 

проверить его с этим:

declare @mydate datetime 
set @mydate = '2011-01-01' 
while @mydate <= '2011-12-31' 
    begin 
    print ((((month(@mydate)-1)/3)+3) % 4) + 1 
    set @mydate = dateadd(month, 1, @mydate) 
    end 

Или, если вы хотите, чтобы это сделать in .net, это как

String.Format("Q{0}", ((((date.Month-1)/3)+3) % 4) + 1); 
5
int CurrentQuarter = (int)Math.Floor(((decimal)DateTime.Today.Month + 2)/3); 

или изменить DateTime.Today на требуемую дату.

+0

Лучший ответ прямо здесь imo. Точно так же я сделал это – DontFretBrett

6

метод выдвижения и меньше сравнения:

public static class DateTimeExtension 
{ 
    public static int GetQuarter(this DateTime dateTime) 
    { 
     if (dateTime.Month <= 3) 
      return 1; 

     if (dateTime.Month <= 6) 
      return 2; 

     if (dateTime.Month <= 9) 
      return 3; 

     return 4; 
    } 
} 
+0

, вы должны использовать «else if», который сделает его еще быстрее. –

8
public static int GetQuarter(DateTime date) 
    { 
     int[] quarters = new int[] { 4,4,4,1,1,1,2,2,2,3,3,3 }; 
     return quarters[date.Month-1]; 
    } 
+0

проконсультируйтесь с вашим ответом с некоторыми пояснениями, чтобы помочь другим в будущем, когда они видят ваш код (после поиска в Google) –

+0

Самый эффективный ответ +1 (если массив объявлен статическим) – JanW

22

Если вы предпочитаете короткие и лаконичные решения без ветвления и массивов, вот мой предпочтительным решением.

Нормальный Квартал:

public static int GetQuarter(this DateTime date) 
{ 
    return (date.Month + 2)/3; 
} 

Финансовый год Квартал:

public static int GetFinancialQuarter(this DateTime date) 
{ 
    return (date.AddMonths(3).Month + 2)/3; 
} 

Целочисленное деление усечет десятичные, что дает вам целочисленный результат.Место методы в статическом классе, и вы будете иметь метод расширения для использования следующим образом:

date.GetQuarter() 
date.GetFinancialQuarter() 
+0

Простой ответ для 'GetQuarter'! – dana

0

Вы можете просто сделать это:

for (int i = 1; i <= 12; i++) { 
    Console.WriteLine("Month {0} - Q{1}", i, Math.Ceiling((i <= 3 ? 12 - i + 1 : i - 3)/3M)); 
} 

Выход будет: enter image description here

+0

Забудьте о броске в int of Math.Ceiling (на картинке), я делал некоторые тесты и забыл удалить его. – boossss

3

Самый простой и последовательный способ достижения этой цели:


Регулярное

Math.Ceiling(date.Month/3.0) 

фискальной (как раз сдвинутой с мод на 2 + 1 четверти)

Math.Ceiling(date.Month/3.0 + 2) % 4 + 1 

01.01.2016 00:00:00 -> Q1 -> FQ4 
01.02.2016 00:00:00 -> Q1 -> FQ4 
01.03.2016 00:00:00 -> Q1 -> FQ4 
01.04.2016 00:00:00 -> Q2 -> FQ1 
01.05.2016 00:00:00 -> Q2 -> FQ1 
01.06.2016 00:00:00 -> Q2 -> FQ1 
01.07.2016 00:00:00 -> Q3 -> FQ2 
01.08.2016 00:00:00 -> Q3 -> FQ2 
01.09.2016 00:00:00 -> Q3 -> FQ2 
01.10.2016 00:00:00 -> Q4 -> FQ3 
01.11.2016 00:00:00 -> Q4 -> FQ3 
01.12.2016 00:00:00 -> Q4 -> FQ3 

Результат представляет собой значение между 1 и 4. Почти любая среда имеет функцию CEIL, поэтому это должно любой язык.

0

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

public string GetQuarterPeriod(DateTime date, int quarterStartMonth) 
    { 
     var quarterDateOffset = date.AddMonths(1 - quarterStartMonth); 
     return $"Q{Math.Ceiling((decimal)quarterDateOffset.Month/3)} {quarterDateOffset.Year}" 
       + (quarterStartMonth == 1 ? "" : $"/{quarterDateOffset.Year + 1}"); 
    } 

Отдает:

GetQuarterPeriod(new DateTime(2018, 4, 1), 4) -> "Q1 2018/2019" 
GetQuarterPeriod(new DateTime(2018, 1, 1), 1) -> "Q1 2018" 

Функция учитывает тот факт, что если месяц январь (1) оно ограничено до одного года.

Смежные вопросы