2012-01-02 27 views
17

Sau đây là các Quarters trong một năm tài chínhLàm thế nào để tôi khám phá quý của một ngày nhất định

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

Nếu tháng của một ngày đầu vào nằm như trên tôi cần đầu ra cho về số khu phố.

Ví dụ,

Nếu tôi đưa ra một ngày đầu vào (nói 02 tháng 1), tôi cần đầu ra như Q4.

Nếu tôi cung cấp đầu vào là (tháng 6 5), đầu ra phải cung cấp Q1.

Dựa trên ngày nhập liệu tôi cần số Quarter.

+0

Bạn có thể làm điều này từ đầu, cho dù Thư viện được tích hợp có tồn tại hay không? –

+0

Chủ đề liên quan - http://stackoverflow.com/questions/1947191/nearest-completed-quarter – adatapost

+0

@AVD: Chủ đề trên không giống như tôi mong đợi kết quả của số Quý cho bất kỳ ngày đầu vào nào được cung cấp. – venkat

Trả lời

18

Bạn chỉ có thể viết một phương pháp

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

Cảm ơn phương pháp của bạn. Nếu phương pháp trên kết quả '4' là đầu ra cho tháng một tháng sau đó tôi cần đầu ra với một số nỗ lực thêm như Q4, Q1, Q2, Q3. Chỉ cần xoay các Khu vực này theo thứ tự khôn ngoan dựa trên tháng của một ngày giờ. Làm thế nào tôi có thể nhận được? – venkat

+0

Haris: Bạn có thể đọc nhận xét trước đó của tôi không. – venkat

+0

Yêu cầu của bạn không rõ ràng đối với tôi với nhận xét của bạn. Bạn có thể giải thích hoặc đăng nó tốt hơn trong một câu hỏi khác không? Đoạn mã trên trả lời câu hỏi hiện tại của bạn –

11

này là dành cho "Năm bình thường" Tôi nghĩ rằng bạn có thể thích ứng mẫu

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

+0

Đơn giản nhưng hiệu quả! –

3

trong sql, nó chỉ đơn giản là

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

kiểm tra xem nó với điều này:

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 

Hoặc nếu bạn muốn làm điều đó trong .net, giống như

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

hoặc thay đổi DateTime.Hôm nay thành ngày bắt buộc.

+0

Câu trả lời hay nhất ngay tại đây imo. Cùng một cách tôi đã thực hiện nó – DontFretBrett

6

phương pháp mở rộng và so sánh ít:

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

bạn nên sử dụng 'else if' mà sẽ làm cho nó thậm chí còn nhanh hơn. –

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

hãy giải thích câu trả lời của bạn với một số giải thích để giúp người khác trong tương lai khi họ thấy mã của bạn (sau khi tìm kiếm trên Google) –

+0

Câu trả lời hiệu quả nhất +1 (nếu mảng được khai báo tĩnh) – JanW

22

Nếu bạn thích các giải pháp ngắn và súc tích mà không phân nhánh và mảng, đây là giải pháp ưa thích của tôi.

Quý Bình thường:

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

tài chính Năm Quý:

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

phận Integer sẽ truncate số thập phân, đem lại cho bạn một kết quả số nguyên.Nơi phương pháp thành một lớp tĩnh và bạn sẽ có một phương pháp khuyến nông sẽ được sử dụng như sau:

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

Câu trả lời đơn giản cho 'GetQuarter'! – dana

0

Bạn chỉ có thể làm điều này:

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

Kết quả sẽ là: enter image description here

+0

quên cast vào int của Math.Ceiling (trong hình), tôi đã làm một số test và quên xóa nó đi. – boossss

3

Cách đơn giản và nhất quán nhất để đạt được điều này:


Regular

Math.Ceiling(date.Month/3.0) 

tài chính (chỉ chuyển lên với một mod bởi 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 

Kết quả là một giá trị từ 1 đến 4. Gần như bất kỳ môi trường nào đều có chức năng CEIL, vì vậy việc này sẽ hoạt động bất kỳ ngôn ngữ nào.

0

Phương pháp này cho phép bạn chỉ định tháng bắt đầu của quý và cũng cung cấp (các) năm cho toàn bộ khoảng thời gian đó.

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

Giving:

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

Chức năng chiếm một thực tế rằng nếu tháng đó là tháng mười hai (1) nó bị hạn chế đến một năm duy nhất.

Các vấn đề liên quan