DB2查询如何传入UTC格式datetime参数并转换日期格式
DB2 UTC格式时间转库内适配格式查询方案
注:你描述中举例的转换结果2022-01-01 08:00:00.000为笔误,传入值2022-01-02T08:00:00.000+00:00转换后对应正确值为2022-01-02 08:00:00.000。
DB2原生支持ISO 8601格式时间字符串的解析,不需要额外自定义函数,根据你库内changedate字段的类型选对应写法即可:
- 如果
changedate是TIMESTAMP类型(推荐的时间存储类型)
两种写法可选:- 固定传入UTC+0时间时,直接用
TO_TIMESTAMP加格式掩码解析,性能最好:
格式掩码中双引号包裹的SELECT * FROM your_table WHERE changedate = TO_TIMESTAMP( '2022-01-02T08:00:00.000+00:00', 'YYYY-MM-DD"T"HH24:MI:SS.FF3"+00:00"' )"T"和"+00:00"会被识别为固定字面量跳过,最终生成的timestamp值和库内存储的YYYY-MM-DD HH24:MI:SS.FF3格式完全匹配,能正常走字段索引,不会出现隐式转换问题。
2. 如果传入的时间时区偏移不固定(不一定是+00:00),用带时区解析的函数自动转UTC时间,兼容性更强:SELECT * FROM your_table WHERE changedate = TIMESTAMP( TO_TIMESTAMP_TZ('2022-01-02T08:00:00.000+00:00', 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM') AT UTC ) - 固定传入UTC+0时间时,直接用
- 如果
changedate是字符串类型存储
直接做字符串替换和截断即可,不需要做时间类型转换:
处理后生成的字符串刚好是SELECT * FROM your_table WHERE changedate = LEFT(REPLACE('2022-01-02T08:00:00.000+00:00', 'T', ' '), 23)2022-01-02 08:00:00.000,和库内存储的字符串格式完全一致。
- 注意:不要直接把未处理的带
T和时区后缀的字符串和字段做等值判断,DB2隐式转换会出现解析报错,或者导致字段索引失效、查询性能骤降。
内容的提问来源于stack exchange,提问作者max092012
相关产品推荐
相关产品推荐

