AMPScript で生年月日から年齢を計算する/Salesforce Marketing Cloud
生年月日から計算した年齢をメール上に表示する AMPScript を書いたので、備忘録として残します。基本的に、メール上に表示する内容は SQL 等で事前に用意しておくのがベストですが、一応 AMPScript でも年齢を計算できるよ、という程度に紹介します。
スクリプトの説明
%%[
VAR @now, @age
VAR @birthdayMD, @nowMD
/* 1. 現在日時を取得 */
SET @now = DATEADD(NOW(), 15, 'H')
/* 2. 現在日時と誕生日の年差を計算して数値型に変換 */
SET @age = FORMATNUMBER(DATEDIFF(birthday, @now, 'Y'), 'N0')
/* 3. 月と日を結合して数値型に変換 */
SET @birthdayMD = FORMATNUMBER(CONCAT(DATEPART(birthday, 'M'), DATEPART(birthday, 'D')), 'N0')
SET @nowMD = FORMATNUMBER(CONCAT(DATEPART(@now, 'M'), DATEPART(@now, 'D')), 'N0')
/* 4. 現在日時の月日より誕生日の月日が未来の場合、年齢から1を減算 */
IF (@birthdayMD > @nowMD) THEN
SET @age = SUBTRACT(@age, 1)
ENDIF
]%%
%%=v(@age)=%%歳
1. 現在日時を取得
NOW 関数で現在日時を取得します。NOW 関数は、CST(アメリカ中部時間)の現在日時を返却するので、DATEADD 関数を使って JST(日本時間)に変換しています。
2. 現在日時と誕生日の年差を計算して数値型に変換
DATEDIFF 関数を使って、現在日時と誕生日の年差を計算します。誕生日の値は日付型の「birthday」に入っています。その結果を FORMATNUMBER 関数で数値型に変換します。
3. 月と日を結合して数値型に変換
DATEPART 関数で現在日時と誕生日の月と日の部分を抜き出します。現在日時が 1 月 1 日、誕生日が 6 月 10 日の場合は次のようになります。この時、抜き出した月日は、テキスト型になっています。
次に、CONCAT 関数で抜き出した月と日を結合します。
そして、FORMATNUMBER 関数で結合した月日を数値型に変換します。
4. 現在日時の月日より誕生日の月日が未来の場合、年齢から 1 を減算
現在日時の月日より誕生日の月日が未来の場合、まだ誕生日を迎えていないので、2 で求めた年差から 1 を減算する必要があります。減算には、SUBTRACT 関数を使用します。
このスクリプトの使い道
期間の長いジャーニーの場合、ジャーニーにエントリした後に誕生日を迎えて年齢が変わることがあるので、メール配信時点の年齢を表示したい時には使えると思います。ただ、メール上に最新の情報を表示したい時は、基本的に年齢だけに限らない場合が多いと思います。そのため、最新の情報を格納したデータエクステンションを用意して、LOOKUP 関数でその情報を取得する方法がよりスマートだと思います。