SQLで年度や四半期を変換することがある。
それをStored Functionで開発したので備忘録として置いておく
1.4月始まり翌年3月末で年度が切り替わる場合
fiscal_years.sql
CREATE FUNCTION [dbo].[fiscalyear]( @Date datetime2)
RETURNS int
AS
BEGIN
declare @inneryear int;
if( month(@Date) between 4 and 12)
set @inneryear = year(@Date)
if( month(@Date) between 1 and 3 )
set @inneryear = year(@Date)-1
return @inneryear
END
GO
1月から3月を一年前にずらしてやればいい。
2.上記の場合で第一四半期から第四四半期まで分類する場合
quarterpart
CREATE FUNCTION [dbo].[quarterpart]( @Date datetime2)
RETURNS int
AS
BEGIN
declare @innerquarter int;
if( month(@Date) between 1 and 3) set @innerquarter= 4
if(month(@Date) between 4 and 6) set @innerquarter= 1
if(month(@Date) between 7 and 9) set @innerquarter= 2
if(month(@Date) between 10 and 12) set @innerquarter= 3
return @innerquarter
END
GO
ここでintを返すようにしているのは後々にOrder byで利用できるようにするため
3.四半期を漢字で返す場合
quarterpart_hanji
CREATE FUNCTION [dbo].[quarterpart_hanji]( @Date datetime2)
RETURNS char(18)
AS
BEGIN
declare @qparthanzi char(2);
if (dbo.quarterpart(@Date)=4) set @qparthanzi = '肆'
if (dbo.quarterpart(@Date)=1) set @qparthanzi = '壱'
if (dbo.quarterpart(@Date)=2) set @qparthanzi = '弐'
if (dbo.quarterpart(@Date)=3) set @qparthanzi = '参'
return cast(dbo.fiscalyear(@Date) as char(4)) + '年度第' + @qparthanzi + '四半期'
END
GO
ただし、これはorder by、pivotで使えないので完全に表示用である。
今回はスカラー値関数で実装したがこれはselect句内で使えるようにするためである。
実際はこの三つをまとめて運用する羽目になるだろうが