1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SQLでの年度と四半期の変換方法(SQLserver)

Posted at

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句内で使えるようにするためである。
実際はこの三つをまとめて運用する羽目になるだろうが

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?