You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-zh@flink.apache.org by Jun Zhang <82...@qq.com> on 2020/09/24 11:34:58 UTC

回复:flinksql接收到字段值格式为2020-09-23T20:58:24+08:00,如何转成TIMESTAMP

Hi &nbsp;jack
如果我手动减去八小时,那么是不是使用eventtime落地的时候,就成了utc时区的值,比如现在是北京时间10点,那么我落地的时间将会是两点,对于使用东八区的人来说,会产生误解。



Best&nbsp;&nbsp;Jun


------------------ 原始邮件 ------------------
发件人: Jark Wu <imjark@gmail.com&gt;
发送时间: 2020年9月24日 15:43
收件人: user-zh <user-zh@flink.apache.org&gt;
主题: 回复:flinksql接收到字段值格式为2020-09-23T20:58:24+08:00,如何转成TIMESTAMP



FROM_UNIXTIME 接收的第一个参数是 unix time 值, 可以理解为UTC时区的值。
所以如果你的 long 值是北京时间下得到的,那么需要自己手动减一个8时区。

Best,
Jark

On Thu, 24 Sep 2020 at 13:54, Joker <gaojintao999@163.com&gt; wrote:

&gt; 不好意思,插入个问题。ts AS TO_TIMESTAMP(FROM_UNIXTIME(create_time / 1000,
&gt; 'yyyy-MM-dd HH:mm:ss')) ,我按此方式生成事件时间列,发现watermark一直比北京时间多8小时,比如create_time
&gt; 为1600926591666,ts计算出来是2020/9/24
&gt; 13:49:51没问题,但在WebUI上发现提取的watermark为2020/9/24 21:49:51
&gt;
&gt;
&gt; | |
&gt; Joker
&gt; |
&gt; |
&gt; gaojintao999@163.com
&gt; |
&gt; 签名由网易邮箱大师定制
&gt;
&gt;
&gt; 在2020年09月24日 13:40,Jark Wu<imjark@gmail.com&gt; 写道:
&gt; Flink 的 TO_TIMESTAMP 函数用的是 Java SimpleDateFormat 来解析时间格式的,所以可以看下
&gt; SimpleDateFormat 的 javadoc。
&gt; 你可以试下 to_timestamp('2020-09-23T20:58:24+08:00',
&gt; 'yyyy-MM-dd''T''HH:mm:ssXXX') 来解析你的数据。
&gt;
&gt; Best,
&gt; Jark
&gt;
&gt; On Wed, 23 Sep 2020 at 21:08, chenxuying <cxydevelop@163.com&gt; wrote:
&gt;
&gt; flinksql 版本是1.11.2
&gt; source接收到字段是字符串类型的时间
&gt; CREATE TABLE sourceTable (
&gt; `time` STRING
&gt; ) WITH(
&gt; ...
&gt; );
&gt;
&gt;
&gt; sink如下
&gt; CREATE TABLE sinktable (
&gt; `time1` STRING,
&gt; `time` TIMESTAMP(3)
&gt; ) WITH (
&gt; 'connector' = 'print'
&gt; );
&gt;
&gt;
&gt; insert语句,不知道怎么正确修改TO_TIMESTAMP默认的格式
&gt; insert into sinktable select
&gt; `time`,TO_TIMESTAMP(`time`,'yyyy-MM-ddTHH:mm:ss+08:00') from sourceTable
&gt;
&gt;
&gt; 报错说是format错误
&gt; Caused by: java.lang.IllegalArgumentException: Unknown pattern letter: T
&gt; at
&gt;
&gt; java.time.format.DateTimeFormatterBuilder.parsePattern(DateTimeFormatterBuilder.java:1663)
&gt; at
&gt;
&gt; java.time.format.DateTimeFormatterBuilder.appendPattern(DateTimeFormatterBuilder.java:1572)
&gt; at java.time.format.DateTimeFormatter.ofPattern(DateTimeFormatter.java:534)
&gt;

回复:flinksql接收到字段值格式为2020-09-23T20:58:24+08:00,如何转成TIMESTAMP

Posted by Joker <ga...@163.com>.
是的,如果手动减去八小时,使用eventtime落地的时候,就成了utc时区的值,但是你可以在SQL逻辑中纠正到东八区。CONVERT_TZ(DATE_FORMAT(event_time,'yyyy-MM-dd HH:mm:ss'),'UTC','GMT+8:00’)。   现在 引入另一个问题,这种情况下watermark为何不需要纠正就自动加了8小时?




在2020年09月24日 19:34,Jun Zhang<82...@qq.com> 写道:
Hi &nbsp;jack
如果我手动减去八小时,那么是不是使用eventtime落地的时候,就成了utc时区的值,比如现在是北京时间10点,那么我落地的时间将会是两点,对于使用东八区的人来说,会产生误解。



Best&nbsp;&nbsp;Jun


------------------ 原始邮件 ------------------
发件人: Jark Wu <imjark@gmail.com&gt;
发送时间: 2020年9月24日 15:43
收件人: user-zh <user-zh@flink.apache.org&gt;
主题: 回复:flinksql接收到字段值格式为2020-09-23T20:58:24+08:00,如何转成TIMESTAMP



FROM_UNIXTIME 接收的第一个参数是 unix time 值, 可以理解为UTC时区的值。
所以如果你的 long 值是北京时间下得到的,那么需要自己手动减一个8时区。

Best,
Jark

On Thu, 24 Sep 2020 at 13:54, Joker <gaojintao999@163.com&gt; wrote:

&gt; 不好意思,插入个问题。ts AS TO_TIMESTAMP(FROM_UNIXTIME(create_time / 1000,
&gt; 'yyyy-MM-dd HH:mm:ss')) ,我按此方式生成事件时间列,发现watermark一直比北京时间多8小时,比如create_time
&gt; 为1600926591666,ts计算出来是2020/9/24
&gt; 13:49:51没问题,但在WebUI上发现提取的watermark为2020/9/24 21:49:51
&gt;
&gt;
&gt; | |
&gt; Joker
&gt; |
&gt; |
&gt; gaojintao999@163.com
&gt; |
&gt; 签名由网易邮箱大师定制
&gt;
&gt;
&gt; 在2020年09月24日 13:40,Jark Wu<imjark@gmail.com&gt; 写道:
&gt; Flink 的 TO_TIMESTAMP 函数用的是 Java SimpleDateFormat 来解析时间格式的,所以可以看下
&gt; SimpleDateFormat 的 javadoc。
&gt; 你可以试下 to_timestamp('2020-09-23T20:58:24+08:00',
&gt; 'yyyy-MM-dd''T''HH:mm:ssXXX') 来解析你的数据。
&gt;
&gt; Best,
&gt; Jark
&gt;
&gt; On Wed, 23 Sep 2020 at 21:08, chenxuying <cxydevelop@163.com&gt; wrote:
&gt;
&gt; flinksql 版本是1.11.2
&gt; source接收到字段是字符串类型的时间
&gt; CREATE TABLE sourceTable (
&gt; `time` STRING
&gt; ) WITH(
&gt; ...
&gt; );
&gt;
&gt;
&gt; sink如下
&gt; CREATE TABLE sinktable (
&gt; `time1` STRING,
&gt; `time` TIMESTAMP(3)
&gt; ) WITH (
&gt; 'connector' = 'print'
&gt; );
&gt;
&gt;
&gt; insert语句,不知道怎么正确修改TO_TIMESTAMP默认的格式
&gt; insert into sinktable select
&gt; `time`,TO_TIMESTAMP(`time`,'yyyy-MM-ddTHH:mm:ss+08:00') from sourceTable
&gt;
&gt;
&gt; 报错说是format错误
&gt; Caused by: java.lang.IllegalArgumentException: Unknown pattern letter: T
&gt; at
&gt;
&gt; java.time.format.DateTimeFormatterBuilder.parsePattern(DateTimeFormatterBuilder.java:1663)
&gt; at
&gt;
&gt; java.time.format.DateTimeFormatterBuilder.appendPattern(DateTimeFormatterBuilder.java:1572)
&gt; at java.time.format.DateTimeFormatter.ofPattern(DateTimeFormatter.java:534)
&gt;