我在crate DB中创建了一个带有timestamp列的表。但是,在将记录插入其中时,没有按照文档中的说明传递时区信息。
insert into t1 values(2,'2017-06-30T02:21:20');
将其存储为:
2 | 1498789280000 (Fri, 30 Jun 2017 02:21:20 GMT)
现在我的查询都失败了,因为时间戳记录为GMT,我的查询全部都在当地时区(亚洲/加尔各答)
如果有人遇到这个问题,请你告诉我最新修改列的方法是将值从GMT更改为IST而不会丢失它。它有数百万条重要记录不能丢失或损坏点。
喝彩!
答案 0 :(得分:1)
CrateDB总是假定时间戳是UTC,当它们存储时没有时区信息。这是因为内部表示是一种简单的long
数据类型 - 这意味着您的时间戳存储为一个简单的数字:https://crate.io/docs/reference/en/latest/sql/data_types.html#timestamp
CrateDB还接受ISO字符串中的时区信息,因此只需插入insert into t1 values(2,'2017-06-30T02:21:20+05:30');
即可将其转换为适当的UTC值。
对于已存储的记录,您可以在查询字段时让DB知道时区,并通过将相应的时区值传递到date_trunc
或date_format
函数来转换输出: https://crate.io/docs/reference/en/latest/sql/scalar.html#date-and-time-functions
答案 1 :(得分:0)
这个UPDATE test set ts = date_format('%Y-%m-%dT%H:%i:%s.%fZ','+05:30', ts);
应该这样做。
cr> create table test(ts timestamp);
CREATE OK, 1 row affected (0.089 sec)
cr> insert into test values('2017-06-30T02:21:20');
INSERT OK, 1 row affected (0.005 sec)
cr> select date_format(ts) from test;
+-----------------------------+
| date_format(ts) |
+-----------------------------+
| 2017-06-30T02:21:20.000000Z |
+-----------------------------+
SELECT 1 row in set (0.004 sec)
cr> UPDATE test set ts = date_format('%Y-%m-%dT%H:%i:%s.%fZ','+05:30', ts);
UPDATE OK, 1 row affected (0.006 sec)
cr> select date_format(ts) from test;
+-----------------------------+
| date_format(ts) |
+-----------------------------+
| 2017-06-30T07:51:20.000000Z |
+-----------------------------+
SELECT 1 row in set (0.004 sec)
`