javascript - Snowflake/javascript 日期时间格式在迭代期间发生变化

标签 javascript javascript-objects snowflake-cloud-data-platform

 Column_name   DateType           Actual data(in table)   
 CALDT         TIMESTAMP_LTZ(9)   2021-12-07 15:17:04.673 -0800

Javascript 将上述日期转换为类似“2021 年 12 月 7 日星期二 14:52:12 GMT-0800(太平洋标准时间)”的内容

这是javascript代码

         var caldt = " SELECT CALDT"
         caldt += "  FROM INFORMATION_SCHEMA.TABLES "
         caldt += " WHERE TABLE_SCHEMA = " + String.fromCharCode(39)  + TARGET_SCHEMA + String.fromCharCode(39)
         caldt += "   AND TABLE_NAME   = " + String.fromCharCode(39)  +  TARGET_TABLE + String.fromCharCode(39);
                 
    var cal_statement = snowflake.createStatement({sqlText: caldt });
    var cal_resultSet = cal_statement.execute();
    var cal_column_name_array = "";    
      
    while (cal_resultSet .next()) {
        var cal_column_name =cal_resultSet .getColumnValue(1);
       **cal_column_name_array = cal_column_name_array += String.fromCharCode(39) + cal_column_name + String.fromCharCode(39) + ", "    ;        
    }
 cal_column_name_array = cal_column_name_array.substring(0, cal_column_name_array.length-2);** 

上面** ... ** 之间的代码正在修改时间戳

但是我需要获得相同的日期时间戳(2021-12-07 15:17:04.673 -0800)和

不是“2021 年 12 月 7 日星期二 14:52:12 GMT-0800(太平洋标准时间)”

如何格式化 javascript 迭代代码以返回日期时间/时间戳。 谢谢

最佳答案

我已经测试过,如果您将 Snowflake 查询中的时间戳列强制为字符串,那么它将避免您的问题。

请参阅下面的测试用例。

  1. 准备数据(注意时间戳列必须是 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');
  1. 准备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;
$$;
  1. 使用时间戳值调用 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)* |
+------------------------------------------------------------------+
  1. 通过将时间戳值转换为字符串(您想要的)来调用 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() 将值从 TIMESTAMP 转换为 JS 内部的 STRING,而不是在 SQL 级别。

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 参数似乎无法控制它。

如有必要,您可能需要手动删除尾随零。

关于javascript - Snowflake/javascript 日期时间格式在迭代期间发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70270046/

相关文章:

javascript - Angular 2+ 管道附加零和逗号

JavaScript 函数作为对象

javascript - 在java脚本中将对象作为属性分配给元素

snowflake-cloud-data-platform - 如何在 Snowflake 过程中使用多线程处理大数据

sql-server - 使用从阶段文件复制到雪花中插入数据

snowflake-cloud-data-platform - 如何将此 Postgresql 代码转换为 Snowflake?或者雪花是怎么写的?

javascript - toMatch 不工作

javascript - 如何使用 Puppeteer 从 XHR 请求中获取 body/json 响应

javascript - 获取嵌套元素值

Javascript有效的代码结构