2017-08-09 4 views
2

請求書の日付から会計期間と年度を取得しようとしています。ケースと一緒に月()関数を使用して、私は期間を得ることができます。期間1は11月ですから、これが真実であるときに+1を行う必要があります日付の書式設定で/ Then/Elseの場合

IF関数を日付関数と一緒に使用すると、現在私のために働いています。

私のクエリは、何かアドバイスをいただければ幸いです

Select a.OrderAccount 
,a.InvoiceAccount 
,a.InvoiceDate 
,year(a.InvoiceDate) as Year 
,month(a.InvoiceDate) as Month, 
Case month(a.InvoiceDate) 
WHEN '11' THEN '1' -- increase year by +1 
WHEN '12' THEN '2'-- increase year by +1 
WHEN '1' THEN '3' 
WHEN '2' THEN '4' 
WHEN '3' THEN '5' 

です。ちょうど元の日付に2ヶ月を追加するためのおかげで

+2

会計期間を含むテーブルを作成します。参加して日付を比較してください。次に、クエリで必要なときに会計期間テーブルを使用することができます。 –

+0

脇に:あなたの 'case'式が' month(a.InvoiceDate) '以外のすべてに文字列値を使用していることが不思議です。 [データ型の優先順位](https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-precedence-transact-sql)に基づいて、各 'when'値が変換されます比較前に整数に変換する。 'then'値は文字列のままです。ヒント:適切なソフトウェア(MySQL、Oracle、DB2など)とバージョンの両方でデータベースの質問にタグを付けると便利です。 'sql-server-2014'です。 'tsql'は選択肢を絞り込みますが、データベースは指定しないことに注意してください。 – HABO

答えて

6

使用DATEADD

MONTH(DATEADD(month,2,a.InvoiceDate)) as FiscalMonth, 
YEAR(DATEADD(month,2,a.InvoiceDate)) AS FiscalYear, 
0

あなたは算術に固執したい場合は、次の会計月(Month(a.InvoiceDate) + 1) % 12 + 1で、暦年に追加する価値が財政を取得します年はMonth(a.InvoiceDate)/11です。

次のコードは、12ヶ月を示しています。

with Months as (
    select 1 as M 
    union all 
    select M + 1 
    from Months 
    where M < 12) 
    select M, (M + 1) % 12 + 1 as FM, M/11 as FYOffset 
    from Months; 

D・スタンレーの答えはあなたの意図は、より明確な保守のために常に配慮ます。

1

Calendar Tableを作成して入力します(これにより、日付の作業がはるかに簡単になります)。の

select C.*, FY.year fiscal_year from Calendar C inner join FiscalYear FY on FY.id = C.id 

:あなたが指定した日付の会計年度を必要なとき

create view FiscalYear 
as 
    select 

     id, 

     case when month = 11 or month = 12 then year + 1 else year end as [year] 


    from Calendar 

だから、ちょうど次のクエリのようなものを使用します。

その後
create table Calendar 
(
    id int primary key identity, 
    [date] datetime, 
    [day] as datepart(day, [date]) persisted, 
    [month] as datepart(month, [date]) persisted, 
    [year] as datepart(year, [date]) persisted, 

    day_of_year as datepart(dayofyear, [date]) persisted, 
    [week] as datepart(week, [date]), 

    day_name as datename(dw, [date]), 

    is_weekend as case when datepart(dw, [date]) = 7 or datepart(dw, [date]) = 1 then 1 else 0 end, 

    [quarter] as datepart(quarter, [date]) persisted 
    --etc...  

) 

--populate the calendar 

declare @date datetime 
set @date = '1-1-2000' 

while @date <= '12-31-2100' 
begin 

    insert Calendar select @date 
    set @date = dateadd(day, 1, @date) 

end 

FiscalYearビューを作成しますもちろん、会計年度は単なる列の計算なので、それをカレンダー表自体の一部にすることもできます。その後、それは単にです:

select * from Calendar 
0

あなたは10個の異なる場所でこのロジックを持っているとロジックの変更は、2018年1月1日に(例えば)開始した場合、あなたの手に混乱を持っています。

ロジックを持つ関数を作成し、同様の機能を使用します。

SELECT InvoiceDate, dbo.FiscalPeriod(InvoiceDate) AS FP 
FROM ... 

のような何か:

CREATE FUNCTION dbo.FiscalPeriod(@InvoiceDate DateTime) 
RETURNS int 
AS BEGIN 
    DECLARE @FiscalDate DateTime 

    SET @FiscalDate = DATEADD(month, 2, @InvoiceDate) 

    RETURN YEAR(@FiscalDate) * 100 + MONTH(@FiscalDate) 
END 

これは201705のような値を返しますが、あなたはdbo.FiscalPeriodMonthを持つことができます()必要に応じてdbo.FiscalPeriodYear()を呼び出します。また、必要なだけ複雑なロジックを1か所に持たせることができます。