【问题标题】:Difference between Date column in database vs Date in java数据库中日期列与java中日期之间的区别
【发布时间】:2020-06-15 14:54:35
【问题描述】:

我必须在 PostgreSQL 中创建一个表。其中一列是add_date,它应该包含插入行的当前日期。

我很困惑:

我是否应该创建一个列为add_date DATE NOT NULL DEFAULT CURRENT_DATE 并让数据库完成生成日期的工作。

我应该将该列声明为 VARCHAR 并使用 java 传递当前日期。

什么应该是最好的方法,我为什么要选择一个?

谢谢。

【问题讨论】:

  • 小心。 PostgreSQL 只在日期列中存储日期,而不是日期时间,这与 Oracle 不同。如果你想存储日期时间使用时间戳类型。
  • @AlexanderPrisadkov:除了 Oracle 之外的每个数据库都在 date 列中存储没有时间的日期值。
  • @AlexanderPrisadkov SQL 标准将Date 类型定义为仅表示日期,没有时间。为了跟踪某个时刻(日期、时间和时区或与 UTC 的偏移量),标准定义了 TIMESTAMP WITH TIME ZONE。要跟踪有时间但没有区域/偏移量(不是片刻)的日期,标准定义了TIMESTAMP WITHOUT TIME ZONE。 Postgres 在这件事上遵循标准。
  • @a_horse_with_no_name ,@BasilBourque 伙计们看看标签:) datetime 包括在内。
  • @a_horse_with_no_name 不是每个数据库都会在日期列中存储没有时间的日期值。 Firebird 或 apache phoenix 的一些方言呢?

标签: java postgresql datetime database-design


【解决方案1】:

从不将日期值存储在 VARCHAR 列中,只是不要

该列绝对应该使用数据类型DATE 定义。您是否想从 Java 中提供价值是另一个问题。

但即使你正确定义为

add_date DATE NOT NULL DEFAULT CURRENT_DATE

您仍然可以通过 Java 传递日期。

String sql = "insert into the_table (some_column, add_date, other_column) values (?,?,?)"
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, 42);
pstmt.setObject(2, LocalDate.now());
pstmt.setString(3, "Some String");

【讨论】:

  • “永远不要在 VARCHAR 列中存储日期值,只是不要”您能否解释一下为什么我们不应该这样做?我问是因为最后一位参与该项目的开发人员使用的是 VARCHAR。
  • 最明显的例子:它将允许您在这样的列中存储无效的日期,甚至像'last friday' 'some day in the future' 这样的值。它不会正确排序,即使是最简单的操作,您也必须将其转换为正确的日期。然后您意识到格式不一致,当您尝试将该字符串转换回正确的日期时会出现大量错误。相信我。像“如何在每行的格式发生变化时将字符串转换为日期”之类的问题可能每周在这里被问一次。
猜你喜欢
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 2020-10-19
  • 2023-03-29
  • 2013-10-19
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
相关资源
最近更新 更多