您可以使用整数或其他适当的类型来表示数据库中的日期/时间值。但是它确实引入了几个问题:
所有使用数据库表的当前和未来 (!!!) 应用程序(Java 或其他)都需要在数据库整数和日期/时间值之间进行转换。
如果您的 SQL 查询、SQL 存储过程或 SQL 触发器涉及相关列,它们可能需要进行转换。这使它们更加复杂/难以正确处理。此外,额外的复杂性可能会导致查询引擎回退到执行查询的较慢方式……因为查询优化器不了解您在做什么。
使用整数表示日期将使人们更难对涉及日期列的表执行临时 SQL 查询。
编辑
是否通过将日期表示为整数来节省空间是特定于数据库的。IIRC,Oracle 将日期/时间值存储为原始整数。而且我希望任何体面的 RDBMS 都会这样做......无论是存储空间还是查询效率。
将日期/时间值存储为整数并不能解决时区问题。这是一个从根本上复杂的问题。
- 在某些情况下,您希望日期或日期/时间表示绝对时间点。
- 在其他情况下,您希望它表示相对于发生某些事件的地理位置/时区的时间点。
- 在其他情况下,您希望表示相对于系统或用户位置的时间。
然后是粒度问题。(为了清楚起见,使用 ISO 日期语法)“1999”与“1999-01-01”或“1999-01-01T00:00:00”的含义相同吗?那么亚秒级精度呢?
关键是没有简单的 SQL 日期/时间(或整数)表示可以处理所有这些。我们看到的错误/问题/困难的根本原因是程序员在他们的实现中走捷径并且(更重要的是)他们的思维马虎。
编辑 2
由于各种数据库及其各自的 JDBC 驱动程序处理日期文字和关于时区的假设的方式不同,仍然存在许多问题。我不是 JDBC 和 SQL 标准方面的专家,但根本问题似乎是:
- 数据库供应商尚未完全实现(例如)SQL-92 中指定的日期时间类型。
- SQL 标准没有为日期时间文字指定单一语法,但允许数据库供应商特定的语法。
- SQL 标准允许默认时区,没有任何标准方法来指定(甚至找出)它的默认值。更多供应商特定的解决方案。
- JDBC 规范没有为应用程序提供获取或设置默认时区或选择日期时间文字语法的方法。
所有这些都为 Java 开发人员带来了一堆可移植性和配置问题。但是,我认为这并不比我们在 Java / RDBMS 应用程序的其他方面遇到的可移植性和配置问题更糟糕。如果完全抛弃 datetime 类型,你就会陷入一堆其他问题;看上面。