Ниже перечислены кварталы финансового года
April to June - Q1
July to Sep - Q2
Oct to Dec - Q3
Jan to March - Q4
Если месяц входной даты лежит так, как указано выше, мне нужен вывод в виде номера квартала.
Например,
Если я ввожу дату (скажем, январь 2), мне нужен вывод в виде Q4
.
Если я ввожу дату (июнь 5), то на выходе должен получиться Q1
.
На основе даты ввода мне нужен номер квартала.
Если вы предпочитаете короткие и лаконичные решения без ветвления и массивов, вот мое предпочтительное решение.
Нормальный квартал:
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()
Смотрите dotnetfiddle
Вы можете просто написать метод расширения для DateTime
public static int GetQuarter(this 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;
}
и использовать его как
DateTime dt = DateTime.Now;
dt.GetQuarter();
Это для "обычного года". Я думаю, вы можете адаптировать образец:
string.Format("Q{0}", (date.Month + 2)/3);
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];
}
Самый простой и последовательный способ достижения этого:
Регулярно
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, поэтому она должна работать и на любом языке.
Метод расширения и меньшее сравнение
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;
}
}
int CurrentQuarter = (int)Math.Floor(((decimal)DateTime.Today.Month + 2) / 3);
или измените DateTime.Today на требуемую дату.
в 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
Или, если вы хотите сделать это в .net, это выглядит следующим образом
String.Format("Q{0}", ((((date.Month-1)/3)+3) % 4) + 1);
Вы можете просто сделать это:
for (int i = 1; i <= 12; i++) {
Console.WriteLine("Month {0} - Q{1}", i, Math.Ceiling((i <= 3 ? 12 - i + 1 : i - 3) / 3M));
}
Этот метод позволяет указать начальный месяц квартала, а также предоставляет год (ы) для периода в целом.
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), он ограничен одним годом.