【问题标题】:How to make default value of CURRENT_TIMESTAMP in JPA如何在 JPA 中设置 CURRENT_TIMESTAMP 的默认值
【发布时间】:2021-12-03 14:26:54
【问题描述】:

这是我的实体列,名为createdDate,我通过User's phone-number 和message text 的值找到它。在 MySQL 中它可以正常工作。

@Column(name = "created_date", insertable = false, updatable = false,
        columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
private LocalDateTime created_date;

但一般来说,我使用 Oracle,我想像 MySQL 一样将 createdDate 值声明为 CURRENT_TIMESTAMP。我是这样添加的,效果很好。

@CreationTimestamp
@ColumnDefault("CURRENT_TIMESTAMP")
protected LocalDateTime createdDate;

但是 createdDate 的值存储到这样的表中 2021-10-15 14:46:27.219000 我不想这样,我想像这种格式将数据存储到数据库中

yyyy-MM-dd HH:mm:ss

不知何故,我没有在 JPA 中使用 Oracle 数据库给出默认值。如何解决?有什么办法可以解决或删除第二个值的结尾?

【问题讨论】:

  • TIMESTAMP 列根本没有任何格式。您看到的任何格式都由您在 显示 值时使用的 SQL 客户端应用。
  • 你试过CURRENT_TIMESTAMP(0)吗?
  • @a_horse_with_no_name 提到的内容非常重要,应该可以消除您的疑问。如果您仍有疑问,我建议您检查与 Java 中的日期时间类型相关的The standard library does not support a formatted Date-Time object.,但事实保持不变,即数据库或语言存储/处理日期时间类型的信息,而不是格式化。

标签: java oracle spring-boot jpa


【解决方案1】:

Oracle 将时间戳存储为比特包,每个比特代表特定的信息。然后,任何客户端程序都可以以他们喜欢的格式显示该值。在您的情况下,如果您想将它们显示为YYYY-MM-DD

alter session set nls_timestamp_format='YYYY-MM-DD';

如果您在 JPA 中执行此操作,并且您使用的是池,则会影响使用该池的所有连接。

例子

SQL> create table t ( c1 timestamp ) ;

Table created.

SQL> insert into t values ( systimestamp ) ;

1 row created.

SQL> select * from t ;

C1
---------------------------------------------------------------------------
15-OCT-21 01.29.45.427944 PM

SQL> select dump(c1) from t ;

DUMP(C1)
--------------------------------------------------------------------------------
Typ=180 Len=11: 120,121,10,15,14,30,46,25,129,232,64

在我的情况下,该值使用我的默认时间戳格式显示

SQL> select parameter,value from v$nls_parameters where parameter='NLS_TIMESTAMP_FORMAT' ;

PARAMETER                     VALUE                                                                     
---------------------------------------------------------------- ----------
NLS_TIMESTAMP_FORMAT          DD-MON-RR HH.MI.SSXFF AM                                                  

让我们深入了解dump 函数的这些值的含义。对于我们的时间戳15-OCT-21 01.29.45.427944 PM,我们得到了以下dump

120,121,10,15,14,30,46,25,129,232,64

  • 世纪:(120-100)*100 = 2000
  • 年份:(121-100) = 21(因为世纪是 2000 + 21 = 2021)
  • 月:10
  • 天:15
  • 小时:14(多余 - 1)然后 13
  • 分钟:30(超出 - 1)然后 29
  • 第二次:46(超额 - 1)然后是 45

其余部分是存储在时间戳值中的特定秒数(请记住,Oracle 中的时间戳存储的秒数最多为纳秒)。由于转储类型为 180,因此没有关联时区。您可以在下面找到来自@Alex Poole 的惊人答案的链接,该链接更详细地解释了我刚刚在这里告诉您的内容,以及其他类型的时区时间戳。

Timestamp Bytes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-05
    • 2023-01-06
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多