- PR -

年度の算出について

1
投稿者投稿内容
どんたくお
ベテラン
会議室デビュー日: 2005/08/29
投稿数: 88
投稿日時: 2006-05-09 21:52
みなさん、こんばんは。
どんたくおです。


SQLServerを使用しております。
現在、登録者を管理するアプリケーションを作成しております。
SQL文で一点、悩ましいと思われるところがありましたので、ご助
言いただければと思います。

その年の加入者数の計算方法です。
年度は、4月1日から翌年の3月31日までを年度とします。
例えば、2006年度となりますと、
2006年4月1日〜2007年3月31日までが2006年度となります。

ここで、2006年度の加入者の数を知りたいということになりますと、

SELECT
COUNT(*)
FROM
tbl
WHERE
regist between CONVERT(datetime, '2006-04-01', 102) AND CONVERT(datetime, '2007-03-31', 102)

というSQL文で算出できると思いますが、これだとダサいと思いました。
// 自分で言うなよという感じですが・・・。
↑だと、結局その年度の開始日と終了日を渡せばよいのですが、す
なわちアプリケーション側で、値を算出しなければならないという
ことになるかなと。

もし、2006年度というのを、一撃必殺で抽出する方法などご存知
の方がおいでましたら、ご教授いただけると幸いです。


よろしくお願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-10 07:24
引用:

どんたくおさんの書き込み (2006-05-09 21:52) より:

↑だと、結局その年度の開始日と終了日を渡せばよいのですが、す
なわちアプリケーション側で、値を算出しなければならないということになるかなと。

もし、2006年度というのを、一撃必殺で抽出する方法などご存知
の方がおいでましたら、ご教授いただけると幸いです。


年度の範囲を持つテーブルと結合すれば良いのでしょうが、
それはそれでダサいって言われそうですね。(;^-^)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2006-05-10 08:12
アプリケーション側で、値を算出して それを 共通関数として使い回すのが,
保守性も高くエレガントだと思います。
めだか
大ベテラン
会議室デビュー日: 2004/11/11
投稿数: 109
投稿日時: 2006-05-10 10:00
SQLサーバー側の関数を作ってしまうってのはどうでしょうか?

fn_nendo_tbl1(2006) 2006-04-01から2007/03/31検索して主キーの集合を返す

select 〜〜〜 from 〜〜〜 where 主キー in fn_nendo_tbl1(2006)

できるかどうかわかりませんが。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-05-10 10:08
引用:

じゃんぬねっとさんの書き込み (2006-05-10 07:24) より:
年度の範囲を持つテーブルと結合すれば良いのでしょうが、
それはそれでダサいって言われそうですね。(;^-^)


いや、年度末が休みの場合、次年度繰越なんて場合もあるから、あながちダサくないと思いますよ。もう、いっそ年度フィールドもってしまったって・・・駄目っ?

#納品後に「4月1日が休みの場合には、前年度に含めて欲しいんだけど」
#と言われて、( ̄Д ̄)エー、となった経験あり。

Oracleなら年度判定用のストアドプロシージャと、関数索引を使うと言う手もありますが、SQLServerにはありましたっけ?
_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-05-10 10:36
引用:

年度は、4月1日から翌年の3月31日までを年度とします。



これで”2006年度”を考えると
指定された年度の数値(2006) + 4月1日 を作り、
その1年後を算出、算出した値から1日さかのぼるってダメですか?

SQLで書くとこんな感じになりますが
#プログラムから渡される数値(2006)をとりあえずDeclareで仮置きしています。
コード:

declare @baseNendo char(4) ;
set @baseNendo = '2006' ;
select
startDay,
dateadd( day , -1, dateadd(year,1, startDay)) endDay
from
(
select
CONVERT(datetime, @baseNendo + '-04-01', 102) startDay
) base ;




コード:

startDay | endDay
------------------------------------------------
2006-04-01 00:00:00.000 | 2007-03-31 00:00:00.000




[ メッセージ編集済み 編集者: 夏椰 編集日時 2006-05-10 10:37 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-10 10:50
引用:

甕星さんの書き込み (2006-05-10 10:08) より:

いや、年度末が休みの場合、次年度繰越なんて場合もあるから、あながちダサくないと思いますよ。


はい。

"一撃必殺で抽出する" とあったので、コマンドが冗長になると、
「ダサいって言われそう」だと思ったのです。(;^-^)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
どんたくお
ベテラン
会議室デビュー日: 2005/08/29
投稿数: 88
投稿日時: 2006-08-05 11:49
3ヶ月近くレスが遅れてすみません。
皆様のご助言をいただきまして、特に4月1日を前年度に加えるように要求があるということを考慮しまして、年度単位のテーブルを持ち、そこから開始日と終了日を取得して、計算させることにしました。

皆様の、ご助言をいただきながら、ご返信が遅れてしまったことを、大変申し訳なく思います。
本当にすみませんでした。
また、レスを下さり、実際のSQL文まで提供していただきまして、本当にありがとうございました。


どんたくお
1

スキルアップ/キャリアアップ(JOB@IT)