如何在Snowflake中处理SQL Server的datetimeoffset(7)数据类型?
SQL Server datetimeoffset(7) 对应Snowflake的类型及精度保留方案
正确的等效数据类型
Snowflake里的**TIMESTAMP_TZ(9)**就是对应SQL Server datetimeoffset(7)的合适类型——TIMESTAMP_TZ支持最多9位微秒小数,完全能覆盖datetimeoffset(7)的7位精度需求,本身是能存下完整值的。
解决精度显示丢失的问题
你看到的Snowflake里值被截断成2023-05-16 18:33:20.865 +0000,不是实际存储丢了精度,而是Snowflake默认的显示格式只展示了3位小数,时区格式也和SQL Server不一样。可以用这几种方法解决:
临时修改会话的显示格式
执行这条SQL,就能让当前会话里的TIMESTAMP_TZ字段输出完整的7位小数和标准时区格式:
ALTER SESSION SET TIMESTAMP_TZ_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF7 TZHTZM';
FF7专门指定保留7位小数,和你SQL Server的精度匹配TZHTZM会输出+00:00这种和源端一致的时区格式
设置完再查,就能看到和SQL Server一模一样的2023-05-16 18:33:20.8659596 +00:00了。
给表字段设置永久显示格式
如果想让这个格式一直生效,建表的时候可以直接给列加FORMAT属性:
CREATE TABLE your_table ( LastUpdatedTime TIMESTAMP_TZ(9) FORMAT 'YYYY-MM-DD HH24:MI:SS.FF7 TZHTZM' );
已经建好的表也能改:
ALTER TABLE your_table MODIFY COLUMN LastUpdatedTime SET FORMAT 'YYYY-MM-DD HH24:MI:SS.FF7 TZHTZM';
验证实际存储的精度
要是担心数据真的丢了,可以用TO_VARCHAR强制输出全精度来确认:
SELECT TO_VARCHAR(LastUpdatedTime, 'YYYY-MM-DD HH24:MI:SS.FF9 TZHTZM') AS FullPrecisionTime FROM your_table;
如果输出里有完整的7位小数,就说明只是显示的问题,数据本身没丢。
关于SQL Server里的0x000000008EF278B5
这个是SQL Server的rowversion(旧称timestamp)类型值,和你的datetimeoffset字段没关系。要迁移这个值的话,Snowflake里用BINARY(8)类型存就行,因为rowversion就是8字节的二进制数据。
内容的提问来源于stack exchange,提问作者gayathri
相关产品推荐
相关产品推荐

