DBT中yyyy-mm-dd格式日期校验的实现求助
DBT中yyyy-mm-dd日期校验报错的解决办法
问题根源:YAML的转义字符处理
你写的正则表达式里的\d和\-在YAML配置文件中需要特殊处理——YAML会将单个反斜杠视为转义符,直接写会导致正则中的关键匹配规则丢失,进而触发报错。
修正后的正则配置
有两种方式解决转义问题:
- 双反斜杠转义:把每个反斜杠替换成两个反斜杠,让YAML正确识别正则中的转义符:
- dbt_expectations.expect_column_values_to_match_regex: regex: "^\\d{4}\\-\\(0[1-9]|1[012]\\)\\-\\(0[1-9]|[12][0-9]|3[01]\\)$"
- 单引号包裹正则:用单引号把正则表达式括起来,YAML会忽略内部的转义处理,直接将内容传递给dbt_expectations:
- dbt_expectations.expect_column_values_to_match_regex: regex: '^\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])$'
额外排查点:数据库正则语法兼容性
如果修正后仍报错,要检查你使用的数据库是否支持\d匹配数字:
- 像PostgreSQL支持
\d,但BigQuery、Redshift等部分数据库需要用[0-9]替代\d,调整后的正则:
- dbt_expectations.expect_column_values_to_match_regex: regex: '^[0-9]{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])$'
更优方案:用日期专属校验规则
正则只能校验格式,无法识别像2023-02-30这种格式合法但实际无效的日期。推荐使用dbt_expectations专门的日期校验规则,既能验证格式又能确保日期合法:
- dbt_expectations.expect_column_values_to_be_date: date_format: '%Y-%m-%d'
内容的提问来源于stack exchange,提问作者Harris
相关产品推荐
相关产品推荐

