如何修正DuckDB查询:基于duration字段计算新增start_time列
修正DuckDB中动态计算时间间隔的查询错误
问题场景
我有一个名为s3-durations.csv的CSV文件,包含duration(数值类型)和timestamp(timestamptz类型)两个字段,通过以下SQL可正常读取数据:
SELECT * FROM read_csv('s3-durations.csv', delim = ',', header = true, columns = { 'duration': 'numeric', 'timestamp': 'timestamptz' });
尝试新增start_time列,计算逻辑为timestamp减去duration毫秒,使用的查询语句如下:
SELECT duration, timestamp, timestamp - INTERVAL duration MILLISECONDS FROM read_csv('s3-durations.csv', delim = ',', header = true, columns = { 'duration': 'numeric', 'timestamp': 'timestamptz' });
执行时触发语法错误:
Parser Error: syntax error at or near "MILLISECONDS"
LINE 1: ...mestamp, timestamp - INTERVAL duration MILLISECONDS
^
但使用常量值(如INTERVAL 5 MILLISECONDS)时查询可正常运行,需修正该查询。
解决方法
DuckDB的INTERVAL关键字仅支持常量值,无法直接传入字段变量。可通过以下三种方式实现动态时间间隔计算:
方法1:使用INTERVAL函数拼接字符串
将duration字段值与时间单位字符串拼接后,传入INTERVAL函数:
SELECT duration, timestamp, timestamp - INTERVAL(duration || ' milliseconds') AS start_time FROM read_csv('s3-durations.csv', delim = ',', header = true, columns = { 'duration': 'numeric', 'timestamp': 'timestamptz' });
方法2:使用MAKE_INTERVAL函数
MAKE_INTERVAL支持直接传入数值参数构建动态时间间隔,语义清晰:
SELECT duration, timestamp, timestamp - MAKE_INTERVAL(milliseconds := duration) AS start_time FROM read_csv('s3-durations.csv', delim = ',', header = true, columns = { 'duration': 'numeric', 'timestamp': 'timestamptz' });
方法3:基于时间单位的数值运算
利用时间单位换算关系,将毫秒转换为秒后与INTERVAL '1 second'相乘:
SELECT duration, timestamp, timestamp - (duration / 1000.0) * INTERVAL '1 second' AS start_time FROM read_csv('s3-durations.csv', delim = ',', header = true, columns = { 'duration': 'numeric', 'timestamp': 'timestamptz' });
三种方法均可正确计算start_time列,推荐使用MAKE_INTERVAL方法,性能与可读性更优。
内容的提问来源于stack exchange,提问作者user51
相关产品推荐
相关产品推荐

