2010-10-09 17 views
6

Czy istnieje sposób w SQL Server, który może pokazać Rok podatkowy (rozpoczyna się 1 października i kończy się 30 września) z tabeli, która ma kolumnę daty (od 1998 do 2010). Oto co zrobiłem:Grupowanie roku obrachunkowego przy użyciu serwera SQL Server

select 'FY1999' as FY, site, count(*) 
from mytable 
where mydate >='10/1/1998' 
    and mydate <'10/1/1999' 
group by site 

select 'FY2000' as FY, site, count(*) 
from mytable 
where mydate >='10/1/1999' 
    and mydate <'10/1/2000' 
group by site 

select 'FY2001' as FY, site, count(*) 
from mytable 
where mydate >='10/1/2000' 
    and mydate <'10/1/2001' 
group by site 

Czy to nie jest zbyt monotonne, gdy robi to od ponad 10 FY roku?

Odpowiedz

6

można nawet stworzyć swoją funkcję zdefiniowaną przez użytkownika w programie SQL Server, które ma datę argument i zwraca rok obrotowy jako int:

CREATE FUNCTION GetFiscalYear(@TheDate date) 
RETURNS int 
AS 
BEGIN 
    DECLARE @FiscalYear int 

    IF DATEPART(month, @TheDate) < 10 
     SELECT @FiscalYear = DATEPART(year, @TheDate) 
    ELSE 
     SELECT @FiscalYear = DATEPART(year, @TheDate) + 1 

    RETURN @FiscalYear 
END 

Następnie można wykorzystać to na s, na przykład:

SELECT Id, ShippingDate, GetFiscalYear(ShippingDate) 
FROM SomeTable 
-1

nie mam odniesienie serwera SQL poręczne, ale oto jak zrobiłbym to w MySQL:

select date_format (date_add(mydate, interval 92 days), 'FY%Y') as FY, site, count(*) 
from mytable 
group by FY, site; 

Istnieje 92 dni w październiku, listopadzie i grudniu, więc mam przesunięcie przez tyle.

1

Tak, jest nieco powtarzalny. Byłbym za pomocą datepart a niektóre łatwo dostrzec zasady:

  • rok podatkowy jest rok od daty, gdy miesiąc jest < 10.
  • rok podatkowy jest rok od daty + 1, jeśli miesiąc > = 10
9

Oto pojedyncza kwerenda, która dostarczy Ci potrzebnych informacji.

SELECT DATEPART(yyyy, DATEADD(mm, 3, mydate)) AS FY, site, COUNT(*) AS row_count 
FROM mytable 
GROUP BY DATEPART(yyyy, DATEADD(mm, 3, mydate)), site 
+0

Wow, nigdy nie myślałem, żeby to zrobić, co za dobry pomysł, to takie proste! Podoba mi się to, ponieważ powoduje, że zapytanie jest samo w sobie zawarte. –

0

Jest to dynamiczny skrypt do Wielkiej Brytanii, kwiecień do marca, różnych terminach można używać jako refernece,

Powodzenia

DECLARE @StartDate DATETIME 
DECLARE @EndDate DATETIME 

SET @StartDate = DATEADD(dd,0, DATEDIFF(dd,0, DATEADD(mm, -(((12 + DATEPART(m, getDate())) - 4)%12), getDate()) - datePart(d,DATEADD(mm, -(((12 + DATEPART(m, getDate())) - 4)%12),getDate()))+1)) 

SET @EndDate = DATEADD(SS,-1,DATEADD(mm,12,@StartDate)) 

SELECT @StartDate,@EndDate 
0

Wczoraj było odpowiedzią na to pytanie , który został następnie usunięty. Nie wiem dlaczego. Czy coś było z tym nie tak?

Proszę nie głosować na tę odpowiedź, chcę tylko wiedzieć, dlaczego została usunięta.

Przy energicznym testowaniu nadal nie mogę tego zrobić. W moim przykładzie rok podatkowy rozpoczyna się 1 lipca.

Odpowiedź brzmiała:

SELECT SUM(value), CAST(Year(DateAdd(Month, -6, TransactionDate)) as varchar) + ' - ' + CAST(Year(DateAdd(Month, 6, TransactionDate)) as varchar) as 'FY' 
FROM   mytable 
GROUP BY CAST(Year(DateAdd(Month, -6, mydate)) as varchar) + ' - ' + CAST(Year(DateAdd(Month, 6, mydate)) as varchar) 
1

Początek roku obrotowego:

DATEADD(MONTH, DATEDIFF(MONTH, '20100401', getdate())/12 * 12, '20100401') 

End of Fiscal Year

DATEADD(MONTH, DATEDIFF(MONTH, '20100401', getdate())/12 * 12, '20110331') 

Wymień getdate() z własnym daty, jeśli wymagane

0

Oto kilka testów Sql opartych na odpowiedzi Simona

DECLARE @basestartdate datetime, @baseenddate datetime 
SET @basestartdate = CAST('1 April 1753' AS datetime) 
SET @baseenddate = CAST('31 March 1754' AS datetime) 

; 
WITh TestData as 
(
SELECT 
    CAST('1 April 2015' AS datetime) input, 
    CAST('1 April 2015' AS datetime) expectedstartdate, 
    CAST('31 March 2016' AS datetime) expectedenddate UNION SELECT 
    CAST('2 April 2015' AS datetime), 
    CAST('1 April 2015' AS datetime), 
    CAST('31 March 2016' AS datetime) UNION SELECT 
    CAST('31 December 2015' AS datetime), 
    CAST('1 April 2015' AS datetime), 
    CAST('31 March 2016' AS datetime) UNION SELECT 
    CAST('1 January 2016' AS datetime), 
    CAST('1 April 2015' AS datetime), 
    CAST('31 March 2016' AS datetime) UNION SELECT 
    CAST('28 February 2016' AS datetime), 
    CAST('1 April 2015' AS datetime), 
    CAST('31 March 2016' AS datetime) UNION SELECT 
    CAST('31 March 2016' AS datetime), 
    CAST('1 April 2015' AS datetime), 
    CAST('31 March 2016' AS datetime) UNION SELECT 
    CAST('1 April 2016' AS datetime), 
    CAST('1 April 2016' AS datetime), 
    CAST('31 March 2017' AS datetime) 
), 
Results AS 
(
SELECT 
    input, 
    expectedstartdate, 
    DATEADD(MONTH, 
      12 * (DATEDIFF(MONTH, @basestartdate, input)/12), 
      @basestartdate) startdate, 
    expectedenddate, 
    DATEADD(MONTH, 
      12 * (DATEDIFF(MONTH, @basestartdate, input)/12), 
      @baseenddate) enddate 
FROM testdata 
) 
SELECT 
    CASE 
     WHEN (expectedstartdate = startdate) THEN 'Pass' ELSE 'Fail' 
    END startdateresult, 
    CASE 
     WHEN (expectedenddate = enddate) THEN 'Pass' ELSE 'Fail' 
    END startdateresult 
FROM results 
ORDER BY input 
Powiązane problemy