Prestoで日付チェックがしたいのだ
やりたいこと
とある古いデータベースからEMBULKでデータをインポートした。型指定めんどいから全部STRINGで。
このテーブルに誕生日があるから、年齢のセグメントを作りたくて年齢算出しようとしたら苦労した話。
年齢の算出は
generation.sql
DATE_DIFF('year',date_parse(CONCAT(SUBSTR(birthday,1,4),'-',SUBSTR(birthday,5,2),'-',SUBSTR(birthday,7,2)),'%Y-%m-%d') ,localtimestamp)
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.
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)
ちゃんと日付の妥当性チェックしてから処理ができるようになりました。
ちゃんちゃん。
Author And Source
この問題について(Prestoで日付チェックがしたいのだ), 我々は、より多くの情報をここで見つけました https://qiita.com/SOPHTO/items/0bb4d46d9468c3c645be著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .