年齢の計算
生年月日から年齢を計算する簡単な計算式(今日の日付-誕生日)/10000の小数点以下切捨て。上記の有名な計算方法があるそうです。
(20070301 - 19920229)/10000
全然知らない&考え付きませんでした。
とにかく単位を統一して計算できるようにと考えていました……。
年月日での計算なので閏日とか全然関係ないのですねorz
以下はユリウス通日を用いた方法です。
ユリウス通日を取得できるjulianday()関数を使います。
閏年を考慮して365日*4に閏日の1を足して計算しています。
age = (now - birthday) / (365 * 4 + 1) * 4
/* SQLiteの場合 */ SELECT ((julianday('now') - julianday(date)) * 0.00273785) FROM birthday; /* MySQLの場合 */ SELECT YEAR(DATE_SUB(now(),INTERVAL to_days(date) DAY)) FROM birthday; /* PostgreSQLの場合 */ SELECT age(date) FROM birthday;
誕生日データを入力する
idとdate(日付)のシンプルなテーブルを作成します。型を指定していますがSQLiteでは文字列として扱われます。
CREATE TABLE birthday ( id INTEGER NOT NULL, date DATE, PRIMARY KEY (id) ); INSERT INTO birthday (date) VALUES (date('now', '-12 years')); INSERT INTO birthday (date) VALUES (date('now', '-21 years')); INSERT INTO birthday (date) VALUES (date('now', '-7 years')); INSERT INTO birthday (date) VALUES (date('now', '-29 years')); INSERT INTO birthday (date) VALUES (date('now', '-40 years')); INSERT INTO birthday (date) VALUES (date('now', '-35 years')); INSERT INTO birthday (date) VALUES (date('now', '-68 years')); INSERT INTO birthday (date) VALUES (date('now', '-12 years', '1 days')); INSERT INTO birthday (date) VALUES (date('now', '-21 years', '1 days')); INSERT INTO birthday (date) VALUES (date('now', '-7 years', '1 days')); INSERT INTO birthday (date) VALUES (date('now', '-29 years', '1 days')); INSERT INTO birthday (date) VALUES (date('now', '-40 years', '1 days')); INSERT INTO birthday (date) VALUES (date('now', '-35 years', '1 days')); INSERT INTO birthday (date) VALUES (date('now', '-68 years', '1 days'));
| CID | 項目名 | 型名 | NOT NULL | 初期値 | キー |
| 0 | id | INTEGER | not null | PRIMARY | |
| 1 | date | DATE |
誕生日を元に年齢を出力
以下にあるSQL文を実行します。SELECT id, date, ((julianday('now') - julianday(date)) * 0.00273785) age FROM birthday;
| id | date | age |
| 1 | 1994-09-06 | 12.0018926903606 |
| 2 | 1985-09-06 | 21.0012056403606 |
| 3 | 1999-09-06 | 7.00257859036057 |
| 4 | 1977-09-06 | 29.0012033403606 |
| 5 | 1966-09-06 | 40.0018846403606 |
| 6 | 1971-09-06 | 35.0025705408552 |
| 7 | 1938-09-06 | 68.0018765908552 |
| 8 | 1994-09-07 | 11.9992084323293 |
| 9 | 1985-09-07 | 20.998521382824 |
| 10 | 1999-09-07 | 6.99989433282399 |
| 11 | 1977-09-07 | 28.998519082824 |
| 12 | 1966-09-07 | 39.999200382824 |
| 13 | 1971-09-07 | 34.999886282824 |
| 14 | 1938-09-07 | 67.9991923333187 |
