如何在DBT中验证"2022-09-06 06:00:00.000000"格式的日期?
DBT验证带微秒时间戳格式的解决方案
核心修正:正则转义问题
你当前的正则测试中,\s在YAML配置里仅做了单次转义,会被YAML解析为普通空格,导致正则逻辑不符合预期。修正后的配置如下:
- name: candle_start_time tests: - dbt_expectations.expect_column_values_to_match_regex: regex: ^\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2}\\.\\d{6}$
把原正则里的\s改为\\s,确保转义后的正则能被数据库正确识别为"匹配空白字符"(此处对应时间与日期之间的空格)。
按数据库适配正则
不同数据库的正则语法存在差异,根据你的使用场景调整:
- PostgreSQL:直接使用上面修正后的正则即可,完全支持
\\s和标准正则语法 - MySQL 5.x:不支持
\\s,需要替换为[[:space:]],配置改为:regex: ^\\d{4}-\\d{2}-\\d{2}[[:space:]]\\d{2}:\\d{2}:\\d{2}\\.\\d{6}$ - BigQuery:支持
\\s,锚点^和$会匹配字段的完整值,符合你的验证需求
更可靠的替代方案:原生类型验证
比起正则,用数据库原生的时间类型检查更准确,还能同时验证值的合理性:
- name: candle_start_time tests: # 验证字段类型为带6位微秒的时间戳 - dbt_expectations.expect_column_values_to_be_of_type: column_type: timestamp(6) # 不同数据库类型名称可能有差异,比如PostgreSQL用timestamptz(6) # 验证时间范围在合理区间 - dbt_expectations.expect_column_values_to_be_between: min_value: '2000-01-01 00:00:00.000000' max_value: '2100-12-31 23:59:59.999999'
验证正则的快速方法
先在数据库客户端中测试正则是否生效,比如PostgreSQL执行:
SELECT '2022-09-06 06:00:00.000000' ~ '^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{6}$';
如果返回true,说明正则逻辑没问题,再调整YAML中的转义即可。
内容的提问来源于stack exchange,提问作者Harris
相关产品推荐
相关产品推荐

