[实战-11] FlinkSql 设置时区对TIMESTAMP和TIMESTAMP_LTZ的影响

table.local-time-zone

table.local-time-zone可用于设置flinksql的时区。
flink的内置数据类型TIMESTAMP(n)或者是TIMESTAMP_LTZ(n), 我们设置水位线都是基于这两种类型,不同的是前者本质是字符串形势,后者本质是long,也因此前者不受时区影响,后者受时区影响类型。(n指的毫秒级的精度取值范围是 0~9)
原始数据库如果不是时间类型,可能要用TO_TIMESTAMP(字符串格式的时间)或者TO_TIMESTAMP_LTZ(long数字,n)

如果原始数据库是string则需要用TO_TIMESTAMP(字符串格式的时间字段)转成TIMESTAMP(n)
如果原始数据库中是long则需要用TO_TIMESTAMP_LTZ(long数字,n) 转成TIMESTAMP_LTZ(n)

DataStream-to-Table Conversion(拓展知识)

datastream API到Table Api转换的时候,是以后string的形式传递event_time, 并且这个string在DataStream Api是以UTC时区转换的,如果你的原始数据中是long, 如果不做处理展示出来的string就是UTC字符串,为了在东八区展示,则需要将long再加上8小时

        // 水位线 允许乱序
        WatermarkStrategy<String> waterStrategy = WatermarkStrategy.<String>forMonotonousTimestamps() //ofSeconds(20)
                .withTimestampAssigner(new SerializableTimestampAssigner<String>() {
   
   
                    @Override
                    public long extractTimestamp(String element, long recordTimestamp) {
   
   
                        try {
   
   
                            Mybook book= JSON.parseObject(element,Mybook.class);
                            return boo.time+8*60*60*1000  //转成东八区
                        }catch (Exception e){
   
   
                            return recordTimestamp;
                        }

                    }
                }).withIdleness(Duration.ofSeconds(timeWindowIdleness));

        SingleOutputStreamOperator<UserSlotGame> processStream = env
                .fromSource(source, waterStrategy, "readKafka"
在Oracle数据库中,TIMESTAMP类型用于存储包含日期时间的数据,且其精确度可以达到小数秒级别,这与DATE类型只能精确到秒是不同的。TIMESTAMP类型有几种变体,包括TIMESTAMPTIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TIME ZONE,它们在存储处理时间时具有不同的特点用途。 参考资源链接:[Oracle中TIMESTAMP的几种类型介绍与实例](https://wenku.csdn.net/doc/6412b71abe7fbd1778d4917e?spm=1055.2569.3001.10343) 首先,TIMESTAMP类型的声明如下: ```sql DECLARE timestamp_var TIMESTAMP(精度); ``` 其中,精度的取值范围是0到9,默认为6。精度指的是小数部分的位数,例如,如果精度为2,则时间可以精确到毫秒级别。 接着,TIMESTAMP WITH TIME ZONE类型会存储时区信息,其声明方式为: ```sql DECLARE timestamp_tz_var TIMESTAMP(精度) WITH TIME ZONE; ``` 这种类型在存储时间时会同时记录该时间所对应的具体时区,这在涉及跨国应用或需要处理不同时区数据的场景中非常有用。 最后,TIMESTAMP WITH LOCAL TIME ZONE类型在声明时不需要时区信息,其使用场景通常是当你想要存储本地时间并期望数据库将时间转换为会话时区: ```sql DECLARE timestamp_ltz_var TIMESTAMP(精度) WITH LOCAL TIME ZONE; ``` 在应用层面,不同精度的TIMESTAMP类型允许开发者根据实际需求选择合适的数据类型。例如,若应用程序需要记录事件发生的确切毫秒数,那么应该使用具有较高精度的TIMESTAMP类型。而当应用需要记录时间戳,并考虑时区转换时,TIMESTAMP WITH TIME ZONE类型更为适合。 理解了这些TIMESTAMP类型及其使用场景后,可以更有效地管理数据库中的时间数据。要深入学习这些类型的应用区别,可以参阅《Oracle中TIMESTAMP的几种类型介绍与实例》,该资料详细介绍了各种类型的特点实例,对于理解并掌握TIMESTAMP类型在Oracle中的应用非常有帮助。 参考资源链接:[Oracle中TIMESTAMP的几种类型介绍与实例](https://wenku.csdn.net/doc/6412b71abe7fbd1778d4917e?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我先森

鼓励一个吧,哈哈

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值