2012-01-02 20 views
17

Los siguientes son los cuartos de un ejercicioCómo buscar la cuarta parte de una fecha determinada

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

Si el mes de la fecha de entrada se encuentra que el anterior Necesito la salida en términos de número de cuarto.

por ejemplo,

Si doy una fecha de entrada (por ejemplo de enero de 2 ª), necesito la salida como Q4.

Si doy la entrada como (Jun 5), la salida debe dar Q1.

Según la fecha de entrada, necesito el número de trimestre.

+0

¿Puede hacer esto desde cero, ya sea que exista o no una biblioteca incorporada? –

+0

Tema relacionado - http://stackoverflow.com/questions/1947191/nearest-completed-quarter – adatapost

+0

@AVD: El hilo anterior no es el mismo que esperaba el resultado del número de trimestre para cualquier fecha de entrada proporcionada. – venkat

Respuesta

18

Simplemente puede escribir un método

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

Gracias por su método. Si el método anterior da como resultado '4' para el mes de enero, entonces necesito la salida con un esfuerzo extra como Q4, Q1, Q2, Q3. Solo rotación de estos cuartos en orden basado en el mes de una fecha y hora. ¿Como puedo conseguir? – venkat

+0

Haris: ¿Puedes leer mi comentario anterior? – venkat

+0

Su requisito no está claro para mí con su comentario. ¿Puedes explicarlo o publicarlo mejor en una pregunta diferente? La pieza de código anterior responde a su pregunta actual –

11

esto es para el "año normal" Creo que se puede adaptar la muestra

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

+0

¡Simple pero efectivo! –

3

en SQL, es simplemente

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

comprobarlo con esto:

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 

O si lo desea hacerlo en .net, es como

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

o cambiar el DateTime.Today hasta la fecha requerida.

+0

La mejor respuesta aquí mismo. De la misma forma que lo hice – DontFretBrett

6

método de extensión y menos comparaciones:

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

, debería usar 'else if', lo que lo haría incluso más rápido. –

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

explique su respuesta con alguna explicación para ayudar a otros en el futuro cuando vean su código (después de una búsqueda en Google) –

+0

Respuesta más eficiente +1 (si la matriz declarada estática) – JanW

22

Si prefiere soluciones cortas y concisas sin ramificación y matrices, aquí está mi solución preferida.

barrio normal:

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

cuarto ejercicio:

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

La división entera truncará decimales, que le da un resultado entero.métodos lugar en una clase estática y tendrá un método de extensión para ser utilizados de la siguiente manera:

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

¡Buena respuesta simple para 'GetQuarter'! – dana

0

simplemente puede hacer esto:

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

La salida será: enter image description here

+0

Olvidé el elenco de int. Math.Ceiling (en la imagen), estaba haciendo algunas pruebas y olvidé eliminarlo. – boossss

3

La forma más simple y consistente de lograr esto:


regular

Math.Ceiling(date.Month/3.0) 

Fiscal (simplemente desplazado con un mod por 2 + 1/4)

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 

El resultado es un valor entre 1 y 4. Casi cualquier entorno tiene una función CEIL, por lo que debería funcionar cualquier lenguaje también

0

Este método le permite especificar el mes de inicio del trimestre y también proporciona el año (s) para el período como un todo.

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}"); 
    } 

Dar: representa

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

Función por el hecho de que si el mes es enero (1) se ve limitada a un solo año.

Cuestiones relacionadas