やりたいこと
とある古いデータベースからEMBULKでデータをインポートした。型指定めんどいから全部STRINGで。
このテーブルに誕生日があるから、年齢のセグメントを作りたくて年齢算出しようとしたら苦労した話。
年齢の算出は
DATE_DIFF('year',date_parse(CONCAT(SUBSTR(birthday,1,4),'-',SUBSTR(birthday,5,2),'-',SUBSTR(birthday,7,2)),'%Y-%m-%d') ,localtimestamp)
日付の形に無理やりして、timestampにparseしてlocaltimestampとyearでdiffをとる=年齢の完成
だが落ちまくる。
Query 20190605_115121_72231_4gcsi failed: Cannot parse "1935-04-00": Value 0 for dayOfMonth must be in the range [1,30]
1935年04月00日生まれがいる
ああもう困った。parseできないよー。
SQLの日付チェックといえばなんだっけなISDATE(string)
Function isdate not registered
はいおこられました。Prestoにはんなもんない。もううるう年計算含めてコーディングしてやるかーっておもったけどw
いいもん発見
PRESTOでの日付の妥当性チェックはTRY_CASTで
try_cast(value AS type) → type
Like cast(), but returns null if the cast fails.
https://prestodb.github.io/docs/current/functions/conversion.html
CAST失敗したらNULL返しまっせファンクション。
コレさえ見つかれば、そうですそういうことでした。
TRY_CAST(CONCAT(SUBSTR(birthday,1,4),'-',SUBSTR(birthday,5,2),'-',SUBSTR(birthday,7,2)) as date) is not null THEN
DATE_DIFF('year',date_parse(CONCAT(SUBSTR(birthday,1,4),'-',SUBSTR(birthday,5,2),'-',SUBSTR(birthday,7,2)),'%Y-%m-%d') ,localtimestamp)
ちゃんと日付の妥当性チェックしてから処理ができるようになりました。
ちゃんちゃん。