【问题标题】:Transform timestamp string in UNIQUE integer将时间戳字符串转换为唯一整数
【发布时间】:2014-11-23 13:08:17
【问题描述】:

我必须转换一个时间戳字符串,如:20140912125314001 (yyyymmddhhMMssSSS) 为我可以像 PK 一样使用的通用 唯一整数 值(我的数据库中的 PK 字段是 Number(9))。

我该怎么办?

【问题讨论】:

  • 时间戳是唯一的吗?
  • 你可能想在这篇文章上花很长时间:stackoverflow.com/questions/997514/…
  • @Alboz 不, int。因为数据库中PK的长度最大为9位。
  • @Zany 比你做不到。尝试执行 System.currentTimeMillis() 看看你得到多少位数...
  • @talex 并非总是如此,我有多个子系统可以同时在我的集中器发送各种信息

标签: java database type-conversion primary-key unique


【解决方案1】:

由于您还没有得到完整的答案,我将这里已经写的内容总结为 cmets。

您的问题可以分为 3 个子问题

  1. 如何解析使用格式yyyymmddhhMMssSSS格式化的日期20140912125314001
  2. 如何将结果放入int类型
  3. 如何使用生成的int 作为数据库中的主键。

第一个问题的答案是:使用SimpleDateFormat。您将获得Date,然后调用getTime() 以获取毫秒数。

第二个问题的答案已经完成:您不能将long 放入int 而不丢失数据。

但是我可以建议您一个解决方法:自 1970 年 1 月 1 日以来,您可能不需要毫秒。我想从应用程序安装开始获得毫秒就足够了。例如,您可以在安装应用程序时获取时间戳,然后从当前时间戳中减去该数字,这样您将得到一个合理的数字,希望不会超过Integer.MAX_VALUE

第三部分是使用时间戳作为关系数据库的主键。我很抱歉,但这是完全错误的。计算机工作速度很快。毫秒不算多。计算机可以在一毫秒内执行数千次操作。这实际上意味着您永远不应该使用时间戳作为主键,甚至是具有唯一约束的字段。如果您想将主键与时间相关联,您可以改用 UUID。但是(正如已经提到的)关系数据库为您提供了更好的工具:自动递增序列。将其用作主键,如果您希望将时间戳(以秒、毫秒或任何其他格式)存储为可用于查询的附加字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-27
    • 2019-05-31
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    相关资源
    最近更新 更多