日付に関するユーザー定義関数を作った。この関数を作った目的は、今年度の範囲で処理をする場面が多かったので、「今年度の最初の日」と「今年度の最後の日」を知るユーザー定義関数を作ろうと思ったためだ。例えば日付が「2010年6月15日」だと、この日に対して「今年度最初の日」は「2010年4月1日」であり、「今年度最後の日」は「2011年3月31日」である。
2010年であっても、4月1日以前は前年度である。日付が「2010年3月15日」だと、この日に対して「今年度最初の日」は「2009年4月1日」であり、「今年度最後の日」は「2010年3月31日」なのだ。
そこでこの関数の中では、まず「日付」に対して「年度」を求めている。「年度」さえ判定できれば、その年の4月1日が「今年度最初の日」であり、次の年の3月31日が「今年度最後の日」である。
使い方は、select dbo.fx日付('2010/06/15','年度最初日')、のようにする。最初の引数が日付で、次の引数がパラメーターだ。パラメーターは「年度最初日」と「年度最後日」を実装しているが、これも拡張可能である。日付に関するいろいろな処理を一括してこの関数に盛り込もうと思ったので、パラメーターによって拡張可能にしている。
また、今日の日付で「今年度の最初の日」を求めたいなら、select dbo.fx日付(getdate(),'年度最初日')、にすることもできる。
-------------------------------------------------------------------------------------------------------
create function [dbo].[fx日付]
(
@P_日付 smalldatetime,
@p_パラメータ varchar(10)
)
returns smalldatetime
as
begin
declare @thisnendo int
declare @thisyear41 smalldatetime
/*年度の取得*/
set @thisyear41 = cast(cast(datepart(year,@p_日付) as varchar) + '/' +'4/1' as smalldatetime)
if @p_日付 >= @thisyear41
begin
set @thisnendo = datepart(year,@p_日付)
end
if @p_日付 < @thisyear41
begin
set @thisnendo = datepart(year,@p_日付)-1
end
/*今年度最初の日を求める*/
if @P_パラメータ = '年度最初日'
begin
return cast(cast(@thisnendo as varchar) + '/' +'4/1' as smalldatetime)
end
/*今年度最後の日を求める*/
if @P_パラメータ = '年度最後日'
begin
return cast(cast((@thisnendo + 1) as varchar) + '/' +'3/31' as smalldatetime)
end
return null
end