C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: SQL文で年齢を算定したい


(過去ログ 99 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■59194 / inTopicNo.1)  SQL文で年齢を算定したい
  
□投稿者/ ながり (4回)-(2011/05/18(Wed) 16:55:40)

分類:[.NET 全般] 

お世話になります。
VB.NET、SQLSERVER2000での開発環境になります。
テーブル社員マスタに生年月日フィールドがあるのですが、このフィールドを使って年齢を計算したいのですが、どのようにすればいいでしょうか?
いろいろ調べてみたのですがオラクル版しか出てなくて・・・
よろしくお願いいたします。
引用返信 編集キー/
■59195 / inTopicNo.2)  Re[1]: SQL文で年齢を算定したい
□投稿者/ Gyackt (2回)-(2011/05/18(Wed) 17:05:46)
No59194 (ながり さん) に返信
> お世話になります。
> VB.NET、SQLSERVER2000での開発環境になります。
> テーブル社員マスタに生年月日フィールドがあるのですが、このフィールドを使って年齢を計算したいのですが、どのようにすればいいでしょうか?
> いろいろ調べてみたのですがオラクル版しか出てなくて・・・
> よろしくお願いいたします。

Oracle同様にすぐ見つかりそうですが・・・まあ計算方法にもよりますが
http://goo.gl/98WFH
引用返信 編集キー/
■59197 / inTopicNo.3)  Re[1]: SQL文で年齢を算定したい
□投稿者/ shu (694回)-(2011/05/18(Wed) 22:26:36)
No59194 (ながり さん) に返信

SQL Server上にユーザ定義関数を作れば出来ますが、SQL文内に埋め込むのは結構手間かと思います。
クライアント(データ取得側)での計算では駄目なのでしょうか?
引用返信 編集キー/
■59200 / inTopicNo.4)  Re[1]: SQL文で年齢を算定したい
□投稿者/ やじゅ (1905回)-(2011/05/19(Thu) 01:37:37)
やじゅ さんの Web サイト
2011/05/19(Thu) 01:44:39 編集(投稿者)

No59194 (ながり さん) に返信
> VB.NET、SQLSERVER2000での開発環境になります。
> テーブル社員マスタに生年月日フィールドがあるのですが、このフィールドを使って年齢を計算したいのですが、どのようにすればいいでしょうか?

下記サイトによるとOracleで年齢を計算する場合は下記のようになる
select trunc(指定日付-生年月日)/10000,0) from dual
select trunc((to_char(sysdate,'yyyymmdd') - 19980913)/10000,0) from dual
http://ayuayuayu01.seesaa.net/article/106439889.html

これをSQLServerにするなら、truncは切り捨てなのでROUNDに変換すればいいのでは。
select ROUND(指定日付-生年月日)/10000,0,1)
select ROUND(CONVERT(CHAR(10), GETDATE(), 112) - 19980913)/10000,0)

未検証なので動作しない可能性あり(^^;
引用返信 編集キー/
■59227 / inTopicNo.5)  Re[1]: SQL文で年齢を算定したい
□投稿者/ 魔界の仮面弁士 (2172回)-(2011/05/19(Thu) 15:47:27)
No59194 (ながり さん) に返信
> 年齢を計算したいのですが、どのようにすればいいでしょうか?

データベースや言語が何であれ、年齢計算を行う場合においては、
基本的には、以下の 2 つのプロセスをとることになるでしょう。


(1) 「生年月日」と「対象日(たとえば今日)」の“年”の差を求める。
(2) 「生年月日」と「対象日」の“月日”の大小を比較して、(1)を補正する。

年だけで判定するケースでは (1) だけで算出できますが、たとえば
「今年で20歳になるけれど、まだ誕生日を迎えていない」人というのは
19歳として扱いますよね。なので、(2)の判定も必要になります。
----------

そして、SQL Server の場合は――

(1) を求めるのは簡単ですよね。それぞれの日付について
『YEAR(日付値)』を使えば西暦が得られますので、それらの差を求めるだけです。
もしくは『DATEDIFF(YEAR, 生年月日, 対象日)』でも同じ結果が得られます。

(2) についてはいろいろなやり方がありますが、たとえば、それぞれの日付値を
 (案1) CONVERT 関数を使って切り出し、文字列として取得
   RIGHT(CONVERT(CHAR(10), 日付, 111), 5) → 'MM/DD' 形式
   RIGHT(CONVERT(CHAR(8) , 日付, 112), 4) → 'MMDD' 形式

 (案2) Month, Day 関数を使って算出し、数値として取得
   Month(日付) * 100 + Day(日付) → MMDD な数値(101〜1231)
などで変換し、CASE 文などを使って (1) を補正すれば OKです。

----------

なお、要件によって年齢の数え方が変わる事にも注意してください。

「数え年」においては、生まれた年を1歳として、毎年1月1日を迎えるごとに+1歳します。

一方、我々がよく目にする暦年齢では、生まれた年を0歳として、誕生日を迎えるごとに+1歳します。

民法を考慮した満年齢では、生まれた年を0歳として、誕生日の前日を迎えるごとに+1歳します。
(誕生日当日の 00:00 に +1 歳されるのではなく、前日の24:00に +1 歳されるという考えに基づくもの)
http://goo.gl/DvN0L
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -