我已经测试过了,如果你强制你的雪花查询中的时间戳列是字符串,那么它将避免你的问题。
请参阅下面的测试用例。
- 准备数据(注意时间戳列需要是 TIMESTAMP_TZ 类型,否则它不会保留原始字符串,因为它会被转换为本地时区或无时区,具体取决于您的设置):
create or replace table date_table(
date_string string,
date_time_tz timestamp_tz,
date_time_ntz timestamp_ntz,
date_time_ltz timestamp_ltz
);
insert into date_table values
('2021-12-07 15:17:04.673 -0800',
'2021-12-07 15:17:04.673 -0800',
'2021-12-07 15:17:04.673 -0800',
'2021-12-07 15:17:04.673 -0800');
- 准备 SP:
create or replace procedure test_date(query string)
returns string
language javascript
as
$$
var my_date = "";
var cal_statement = snowflake.createStatement({sqlText: QUERY });
var rs = cal_statement.execute();
while (rs.next()) {
my_date += '*' + rs.getColumnValue(1) + '*\n';
my_date += '*' + rs.getColumnValue(2) + '*\n';
my_date += '*' + rs.getColumnValue(3) + '*\n';
my_date += '*' + rs.getColumnValue(4) + '*';
}
return my_date;
$$;
- 使用时间戳值调用 SP(它将显示您的问题):
call test_date('select * from date_table');
+------------------------------------------------------------------+
| TEST_DATE |
|------------------------------------------------------------------|
| *2021-12-07 15:17:04.673 -0800* |
| *Tue Dec 07 2021 23:17:04 GMT+0000 (Coordinated Universal Time)* |
| *Tue Dec 07 2021 15:17:04 GMT+0000 (Coordinated Universal Time)* |
| *Tue Dec 07 2021 23:17:04 GMT+0000 (Coordinated Universal Time)* |
+------------------------------------------------------------------+
- 通过将时间戳值转换为 STRING(您想要的)来调用 SP:
call test_date('select date_string, date_time_tz::string, date_time_ntz::string, date_time_ltz::string from date_table');
+---------------------------------+
| TEST_DATE |
|---------------------------------|
| *2021-12-07 15:17:04.673 -0800* |
| *2021-12-07 15:17:04.673 -0800* |
| *2021-12-07 15:17:04.673000000* |
| *2021-12-07 23:17:04.673 Z* |
+---------------------------------+
因此,您需要确保使用 timestamp_tz 数据类型并转换为字符串,这应该有助于解决您的问题。
更新
我们可以使用getColumnValueAsString() 代替ResultSet 对象的getColumnValue() 在JS 内部而不是在SQL 级别将值从TIMESTAMP 转换为STRING。
https://docs.snowflake.com/en/sql-reference/stored-procedures-api.html#getColumnValueAsString
所以更新的SP如下:
create or replace procedure test_date(query string)
returns string
language javascript
as
$$
var my_date = "";
var cal_statement = snowflake.createStatement({sqlText: QUERY });
var rs = cal_statement.execute();
while (rs.next()) {
my_date += '*' + rs.getColumnValueAsString(1) + '*\n';
my_date += '*' + rs.getColumnValueAsString(2) + '*\n';
my_date += '*' + rs.getColumnValueAsString(3) + '*\n';
my_date += '*' + rs.getColumnValueAsString(4) + '*';
}
return my_date;
$$;
然后我们就可以运行 SELECT *:
call test_date('select * from date_table');
+----------------------------------------+
| TEST_DATE |
|----------------------------------------|
| *2021-12-07 15:17:04.673 -0800* |
| *2021-12-07 15:17:04.673000000 -08:00* |
| *2021-12-07 15:17:04.673000000* |
| *2021-12-07 23:17:04.673000000* |
+----------------------------------------+
我不知道是什么控制了毫秒部分的位数,因为 TIMESTAMP_%_OUTPUT_FORMAT 参数似乎无法控制它。
如果需要,您可能需要手动删除尾随零。