1

我在 crate DB 中创建了一个带有时间戳列的表。但是,在向其中插入记录时,没有像文档中提到的那样传递时区信息。

insert into t1 values(2,'2017-06-30T02:21:20');

这被存储为:

2   | 1498789280000 (Fri, 30 Jun 2017 02:21:20 GMT)

现在我的查询都失败了,因为时间戳记录为 GMT 并且我的查询都在本地时区(亚洲/加尔各答)

如果有人遇到这个问题,请告诉我修改列以将值从 GMT 更改为 IST 而不丢失它的最佳方法是什么,它有几百万条不能丢失或损坏的重要记录。

干杯!

4

2 回答 2

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 值。

对于已经存储的记录,您可以在查询字段时让数据库知道时区,并通过将相应的时区值传递给date_truncordate_format函数来转换输出:https ://crate.io/docs/reference/en /latest/sql/scalar.html#date-and-time-functions

于 2017-07-04T08:18:16.683 回答
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)

`

于 2017-07-17T09:30:58.597 回答