发生这种情况是因为
Snowflake
s
TIMESTAMP_NTZ
具有高达纳秒的精度,但是
JavaScript
的Date对象的精度仅为毫秒,并且在转换时间戳时,这种差异可能导致意外的舍入行为
一种解决方案可以是在存储过程中手动构造ISO字符串,方法是将时间戳截断为秒,并确保显式包含毫秒
CREATE OR REPLACE PROCEDURE "timestamp_test"("ts" TIMESTAMP_NTZ(9))
RETURNS VARCHAR(16777216)
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS $$
function toIsoStringWithPrecision(date) {
const pad = (num, size) => ('000' + num).slice(size * -1);
const isoString = date.getUTCFullYear() +
'-' + pad(date.getUTCMonth() + 1, 2) +
'-' + pad(date.getUTCDate(), 2) +
'T' + pad(date.getUTCHours(), 2) +
':' + pad(date.getUTCMinutes(), 2) +
':' + pad(date.getUTCSeconds(), 2) +
'.' + pad(date.getUTCMilliseconds(), 3) + 'Z';
return isoString;
}
const date = new Date(ts.getTime());
return toIsoStringWithPrecision(date);
$$;
pad
此处确保日期的每个部分都有正确的长度(如有必要,可添加零)
getUTCMonth
以开头
0
(例如,Jan=0,Fab=1,…等等),这就是我们添加的原因
+1
.