我已经在crate DB中创建了一个带有时间戳列的表。但是,在向其中插入记录时,没有像文档中提到的那样传递时区信息。
insert into t1 values(2,'2017-06-30T02:21:20');它被存储为:
2 | 1498789280000 (Fri, 30 Jun 2017 02:21:20 GMT)现在我的查询都失败了,因为时间戳已经记录为GMT,并且我的查询都在localtime timezone (亚洲/加尔各答)
如果有人遇到这个问题,请告诉我修改列的最好方法是什么,以便在不丢失GMT到IST的情况下将值从GMT更改为IST,它有数百万条不会丢失或损坏的重要记录。
干杯!
发布于 2017-07-04 16:18:17
当时间戳存储时没有时区信息时,CrateDB始终假定时间戳为协调世界时。这是由于内部表示为简单的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
发布于 2017-07-17 17:30:59
这个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)`
https://stackoverflow.com/questions/44835245
复制相似问题