You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 12:12:31