kintone関数で『1970年以前の』年齢計算にチャレンジ その1
松田さんの配信『kintone関数で年齢計算にチャレンジ(kintone標準機能)』に影響を受けて考えてみました。1970年以降の年齢計算は以下の動画内にて、kintone標準機能でスマート✨に実装されています。
じゃあ1970年以前もちょっとやってみようかな、ということでチャレンジと気軽に考えていたのですが、その時はこんなにドツボにはまろうとは思いもよらなかったのです・・・『その1』ということで察していただけると倖いです🙏
前段 基本機能のおさらい
DATE_FORMAT関数の限界を把握する
上記の動画で活用されているDATE_FORMAT関数は1970年以降しか対応していません。ついでに上限も検証したところ2286-11-20でした。日付フィールドが内部的には『秒』で計算されており、プラスの0~10桁で計算しているのではないか?と思われます(結果からの逆追いなので詳細はわかりませんが・・・)
というわけでDATE_FORMATが使えるのは 1979-1-1~2286-11-21 の間ということがわかりました。って公式ヘルプにちゃんと書いてありました!(赤色部分で強調しました)
↓一応kintoneでの実証結果も張り付けておきます
日付フィールドを把握する
kintoneの日付フィールド(公式ヘルプ)は内部的には 1970年1月1日0時00分00秒を基準に秒単位でデータを持っています( UNIX時間 )。上記の日時が0秒となりそこから1分で60秒、1時間で3600秒、1日で86400秒と加算されていきます。
1592092800秒=18427日 となり、2020/6/14は1970/1/1の18427日後です。
では1970年より前は?というと逆に減算となりマイナスの数値が出ます
-172800秒=-2日。1969年12月30日は1970年1月1日の-2日後、つまり2日前です。
日付フィールドの限界
こちらも試してみました。フィールドの赤文字で出ている通り1000-01-01~9999-12-31が設定範囲となります。なお、こちらは公式ヘルプの日付フィールドのページには記載は無いようです・・・が、フィールドの入力制限 というページに記載がちゃんとありました。抜かりない(書いてなかった、と書こうとして、キーワード検索して見つけました。ヘルプページの使い方に詳しくなっていく・・・)
ただ、範囲外の挙動としてはちょっと独特で、1000年より前の年数を指定した場合、計算はできますが保存はできません。下の画像で1000-01-01と0001-1-1を秒で表した値が違っているのが確認できます。
9999年を超えた日付についてはカレンダー表示はできるのですが、日付が選択できずフィールドに設定できません。
本論)考え方のアプローチ①1970年以前でDATE_FORMAT
最初のコンセプトは、(動画内の計算がとてもシンプルにまとまって目的を達成していたので) 1970年以前もDATE_FORMATと同じような計算式が組めないか?というのが出発点でした。マイナスとはいえ時間が出るのなら、今日から誕生日を引いて日の差を計算して、その結果をどうにかすればできるのではないか?と考えました。
①の結果は?
結論から言うとダメでした。1970年以前と以後を分けて西暦を出して引き算して、年齢を出そうとしたのですがどうしても1歳年を取る前後がずれたりします。スクリーンショットにもありますが、うるう年があるから必ずしも1年365日じゃないんですよね・・・うるう年め!考慮した計算式を考えようとしたけど撃沈。どうにかできませんでした。が、起算日から生年月日を引けば生きてきた期間(秒)が計算できることに気づきました。
考え方のアプローチ②生存期間から年齢を計算する
起算日から生年月日を引けば生存期間が計算できる。という点に着目しました。考え方としては以下の通りです。とてもシンプル。
起算日 - 生年月日 = 1970年後の経過期間(秒) - 1970年以前の経過期間(マイナス秒) = 生存期間(秒)
で、シンプルなこの値をどうするか?86400秒(1日)で割り、生存期間(日)になります。ここまでは良い。
365で割りました。年が出てきますが、うるう年分が誤差になります。うるう年の修正をどうにかして、結構いい線まで行くのですがうるう年の2/29 うるう日周りがうまくいきません。ここで先の動画の松田さんと情報をシェア、単純に引くという思い付きは良かったものの誤差は残っています。プレゼンに耐えうるように絵文字とかいろいろ仕込んでいるあたりに本気度がうかがえます。結果は残念でしたが・・・
考え方のアプローチ③1年は何日か?
そもそも1年が365日ではない、より正確な1年とは何日か?というアプローチを話をZoomでしながら文献を調査しながらアプリを作成。いや楽しかったです。ホントに。で、1年は365.2425日、正確には31556952秒という太陽年というところにたどり着きました。この計算はとてもシンプルでほぼ近しい年齢が出るのですが、日付フィールド自体から計算すると31536000秒、誤差の出る度合いはかなり低くなったのですがそれでもたまに誤差が出てしまいます。すごいシンプルでかなり近しいところまでは行ったんだけどなぁ。天文学的には一番正解に近い。これをちょっと切り上げ・切り下げ補正して、どうにかできたらシンプルで素晴らしいのですが上振れ下振れがあって、うまく補正できませんでした。
というのが、↓の配信時点でのお話
逆に近いところまで行けてしまうと、なかなか諦められなくなるんですよね。執着しすぎるのも良くないけど、折角だからやってみたい。
というわけで、もうちょっとだけ続くんじゃ・・・➡(後日、別noteにて予定しています)