ホチキス先生の「プログラマーと呼ばれたい」

InfoPath & SQL Server !

SQL Serverのユーザー定義関数を使おう~(10)月曜から始まる年度週番号ユーザー定義関数

leave a comment »

以前、「年度週番号」を返すT-SQLのユーザー定義関数を作ったことを書いた。ある日付が、その年度の何週目にあたるかを求める必要があったからだ。以前に書いたユーザー定義関数はこのようなものだった。

———————-(ここから)———————-

create function fx年度週番号
    (
    @p_日付 datetime
    )
returns int
as

begin
declare @thisyear41 datetime
declare @overyear41 datetime
set @thisyear41 = cast(cast(datepart(year,@p_日付) as varchar) + ‘/’ +’4/1′ as datetime)
set @overyear41 = cast(cast(datepart(year,@p_日付)-1 as varchar) + ‘/’ +’4/1′ as datetime)
    if @p_日付 > @thisyear41
    begin
        return datediff(week,@thisyear41,@p_日付)+1
    end
    if @p_日付 < @thisyear41
    begin
        return datediff(week,@overyear41,@p_日付)+1
    end
    if @p_日付 = @thisyear41
    begin
        return 1
    end
return null
end

———————-(ここまで)———————-

引数にする日付の年の4月1日を求め、日付が4月1日よりも後だったらその日付は4月1日から12月31日までであり、4月1日よりも前だったら年が変わっているので1月1日から3月31日までであると判定し、週の番号を求める仕組みだった。

このユーザー定義関数では、日曜日が週の最初に来る値を返す。しかし欲しかったのは日曜日が週の最後に来る値を返すユーザー定義関数だった。そこでこのユーザー定義関数を修正し、月曜で始まる週として年度週番号を返すユーザー定義関数に変更した。変更は力技的であり、日付が日曜ならば年度週番号を1マイナスする、という仕組みにした。

———————-(ここから)———————-

create function fx年度週番号
    (
    @p_日付 datetime
    )
returns int
as

/*
日曜はじまりの年度週番号を返すように変更
*/

begin
declare @thisyear41 datetime
declare @overyear41 datetime
set @thisyear41 = cast(cast(datepart(year,@p_日付) as varchar) + ‘/’ +’4/1′ as datetime)
set @overyear41 = cast(cast(datepart(year,@p_日付)-1 as varchar) + ‘/’ +’4/1′ as datetime)
declare @sunday_minus int
set @sunday_minus = 0
if datepart(weekday,@p_日付) = 1
set @sunday_minus = 1
    if @p_日付 > @thisyear41
    begin
        return datediff(week,@thisyear41,@p_日付)+1-@sunday_minus
    end
    if @p_日付 < @thisyear41
    begin
        return datediff(week,@overyear41,@p_日付)+1-@sunday_minus
    end
    if @p_日付 = @thisyear41
    begin
        return 1
    end
return null
end

———————-(ここまで)———————-

Written by Yoshio Matsumoto

2011年2月13日 @ 12:53 AM

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。