如何查询BigQuery中int64类型timestamp字段的日期范围?
正确的BigQuery日期范围查询方式
首先得解决你遇到的核心问题:类型不匹配,以及时间单位可能没对应上。咱们一步步来:
为什么之前的查询出错?
你直接拿int64类型的时间字段和字符串格式的日期比较,BigQuery不会自动帮你做类型转换,所以才会抛出Argument type mismatch的错误。而用Unix值查询返回全量数据,大概率是你用的Unix时间单位和字段存储的不一致(比如字段存的是微秒,你用了秒级的Unix值,数值差了百万倍,自然所有数据都满足条件)。
正确的查询方法
首先得确定你的int64字段存储的是哪种时间戳:从描述里的显示格式带微秒来看,很大概率是微秒级的Unix时间戳(从1970-01-01 00:00:00 UTC开始的微秒数)。对应的解决方法有两种:
方法1:把int64字段转成TIMESTAMP类型,再和日期字符串转的TIMESTAMP比较
这种方式可读性更强,适合日常查询:
SELECT * FROM `your_project.your_dataset.your_table` WHERE TIMESTAMP_MICROS(your_timestamp_int64) > TIMESTAMP('2018-01-01 00:00:00')
如果你的字段是毫秒级时间戳,就把TIMESTAMP_MICROS换成TIMESTAMP_MILLIS;秒级的话用TIMESTAMP_SECONDS。
方法2:把目标日期转成对应单位的int64,直接做数值比较
这种方式性能略优(少一次类型转换),适合大数据量查询:
SELECT * FROM `your_project.your_dataset.your_table` WHERE your_timestamp_int64 > UNIX_MICROS(TIMESTAMP('2018-01-01 00:00:00'))
同样,根据时间单位替换UNIX_MICROS为UNIX_MILLIS或UNIX_SECONDS。
验证时间单位是否正确
不确定字段存的是哪种单位?先跑个小查询验证:
SELECT your_timestamp_int64, TIMESTAMP_MICROS(your_timestamp_int64) AS micros_converted, TIMESTAMP_MILLIS(your_timestamp_int64) AS millis_converted, TIMESTAMP_SECONDS(your_timestamp_int64) AS seconds_converted FROM `your_project.your_dataset.your_table` LIMIT 5
看哪个转换后的时间和你看到的2017-11-13T02:40:57.948000一致,就用对应的函数。
内容的提问来源于stack exchange,提问作者whatthefee
相关产品推荐
相关产品推荐

