【问题标题】:Datastax Java driver saving timestampDatastax Java 驱动程序保存时间戳
【发布时间】:2020-11-14 12:35:12
【问题描述】:

我正在使用带有 mapperd 的 datastax java 驱动程序

我想将纪元保存为时间戳

device_id | timestamp                       
--------------------------
  2323 | 1595077868994000 
122112 | 2020-07-25 05:30:00.000000+0000

目前我使用的是 ZonedDate 时间。但是当我通过 java 代码插入记录时,它会保存为纪元,如第 1 行所示

insert into table (device_id , timestamp ) VALUES ('122112',toTimestamp(toDate(now()))) ;

但是,当我使用上述查询插入时,它以更易读的格式存储时间戳 如何配置 datastax 驱动程序以可读格式存储时间戳

这是我的实体

public class Table {

@PartitionKey(value = 0)
private String deviceId;

private Instant timestamp;

Instant 是唯一一个具有时间戳的编解码器。我只想以毫秒精度将时间戳存储到数据库中,并希望它在 UI 上易于阅读

那我正在使用 Object Mapper 、 Dao 和刚刚调用的 Save 方法

@Dao
public interface TableDao {

@Insert
boolean save(Table table);
}

【问题讨论】:

  • timestamp 列不是timestamp 类型吗?如果不是,这是一个很好的理由。
  • CREATE TABLE 表(device_id 文本,timestamp 时间戳
  • 它的时间戳列
  • 好的。那么相关的 Java 代码是什么样的呢?
  • 我有更新代码。我没有找到任何可以直接使用的 java.util.Date 编解码器

标签: cassandra datastax-java-driver


【解决方案1】:

时间戳作为 8 字节长的数字存储在 Cassandra 中。所有到人类可读表示的转换都应该在客户端完成,例如,由DateTimeFormatter 转换。 cqlsh 也是如此——它接收 8 字节长的数字,并将其转换为文本表示形式。

更新,澄清后:看起来该代码以微秒而不是毫秒为单位推送数据,从而导致未来的值更远,并且很可能会重载 Python 的日期/时间表示

【讨论】:

  • 好的,为什么我在第 1 行和第 2 行看到 2 种不同的格式? 2 是我用查询插入的,1 是用 datastax 插入的
  • 您在cqlsh 中看到了吗?什么版本的 Cassandra?
  • 这个毫秒数代表Fri Jan 03 52516 09:49:54,我觉得Python的实现简直就是重载了。我认为您需要删除最后三个零才能获得可管理的东西(Sat Jul 18 2020 13:11:08 - 如果我们不使用000)。有时会混淆USING TIMESTAMP 中值的时间戳以微秒为单位,而实际时间戳值以毫秒为单位
  • 哇..明白了..但现在真正的问题。如何删除即时数据类型中的最后 3 个 0?或更改 cqlsh 中的某些内容以显示可读的文本时间戳
  • 即时正确表示数据 - 我认为您传入的数据以微秒为单位...您需要检查如何将数据分配给该 Instant 字段
猜你喜欢
  • 2015-10-24
  • 2016-05-21
  • 2016-11-29
  • 2016-11-29
  • 2018-02-15
  • 1970-01-01
  • 2015-12-13
  • 2017-07-13
  • 2014-05-04
相关资源
最近更新 更多