首页 > 解决方案 > CURRENT_TIMESTAMP() 精度?

问题描述

文档说我们可以指定从 0(秒)到 9(纳秒)的精度

但是,无论我做什么,它似乎都默认为毫秒...

SELECT 
  CURRENT_TIMESTAMP() AS CT0a
  ,to_varchar(CT0a, 'yyyy-mm-dd hh24:mi:ss.FF9') AS CT0b
  ,CURRENT_TIMESTAMP(1) AS CT1a
  ,to_varchar(CT1a, 'yyyy-mm-dd hh24:mi:ss.FF9') AS CT1b
  ,CURRENT_TIMESTAMP(9) AS CT9a
  ,to_varchar(CT9a, 'yyyy-mm-dd hh24:mi:ss.FF9') AS CT9b
  ;

如果我用足够的小数显示它,似乎会返回相同的东西,这总是毫秒......

CT0A 2020-04-08 23:37:56.667 +0000  
CT0B 2020-04-08 23:37:56.667000000  
CT1A 2020-04-08 23:37:56.600 +0000  
CT1B 2020-04-08 23:37:56.667000000  
CT9A 2020-04-08 23:37:56.667 +0000  
CT9B 2020-04-08 23:37:56.667000000

CT0a、CT1a 和 CT2a 以适当的小数位数显示,但 CT0b、CT1b 和 CT9b 都显示完全相同的时间,最多 3 位小数...

我错过了一些明显的东西吗?

标签: snowflake-cloud-data-platform

解决方案


虽然 Snowflake 时间戳数据类型支持高达 9 位的精度,但 current_timestamp 函数不支持。任何超过毫秒的时间都将是时钟的错误精度,因此没有报告。

https://docs.snowflake.com/en/sql-reference/functions/current_timestamp.html

有效值范围为 0 - 9。但是,大多数平台不支持真正的纳秒精度;您获得的精度可能低于您指定的精度。在实践中,精度通常最多约为毫秒(3 位)。

如果不指定输出格式,即使内部精度更高,Snowflake 也会以小数点后三位显示秒:

select to_timestamp(15863566077839811234, 9); -- Seconds has 9 digit precision, but displays 3
select to_varchar(to_timestamp(15863566077839811234, 9), 'yyyy-mm-dd hh24:mi:ss.FF9'); -- Displays all 9 digit precision

推荐阅读