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

QuestDB中Python time.time()写入时间戳异常问题

问题根因

QuestDB的TIMESTAMP类型原生存储微秒分辨率的Unix时间戳整数,即从UTC时间1970-01-01 00:00:00开始累计的总微秒数。时间写入异常、结果偏移的核心原因是时间戳单位换算错误:

  • Python标准库time.time()返回的是秒级浮点数,和QuestDB要求的微秒整数差了6个数量级
  • 直接去掉浮点数小数点转整数的操作没有做正确的单位换算,传入的数值量级完全错误,才会出现远到2495年的偏移结果。
正确写入方式

以下任意一种方式都可以实现正确写入:

1. 标准time库转换(全Python版本兼容)

把秒级浮点数乘以10^6转成整数,得到符合要求的微秒级时间戳再写入:

import time

# 秒级时间戳转微秒,匹配QuestDB存储格式
ts_micro = int(time.time() * 1_000_000)
# 将ts_micro作为值传入timestamp列即可

2. 无精度损失转换(Python 3.7+推荐)

用time.time_ns()获取纳秒级整数时间戳,直接整除1000得到微秒值,完全避免浮点数运算带来的精度误差:

import time

# 纳秒转微秒,无浮点数精度损耗
ts_micro = time.time_ns() // 1000

3. 传入datetime对象(使用官方Python客户端时推荐)

如果使用QuestDB官方Python客户端连接数据库,不需要手动换算时间戳,直接传入带UTC时区的datetime对象即可,客户端会自动完成格式转换:

from datetime import datetime, timezone

# 生成UTC时区的当前时间,禁止传入无时区的本地时间
now_utc = datetime.now(timezone.utc)
# 直接将now_utc传入对应字段即可
注意事项
  • 禁止直接传入秒级、毫秒级时间戳,必须换算为微秒整数,否则必然出现时间量级偏移
  • QuestDB所有时间默认按UTC时区处理,传入本地时间前必须先转换为UTC时区,否则会出现固定时区偏移(比如东八区时间直接传入会和实际差8小时)
  • 写入后如果查询结果和预期时间差整小时数,优先检查传入时间的时区配置是否正确。

内容的提问来源于stack exchange,提问作者Selman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:24:25