【问题标题】:Get max and min date of java.sql.date获取 java.sql.date 的最大和最小日期
【发布时间】:2016-05-10 12:07:01
【问题描述】:

我到处都可以看到我必须使用的日期的最小值和最大值:

Date dateModificationMin = new Date( Long.MIN_VALUE );
Date dateModificationMax = new Date( Long.MAX_VALUE );

但我在我的 java.sql.date 上执行它的返回: 最小日期为 055-12-02 最大日期为 994-08-17

如何获取 java.sql.date 的最大值和最小值?

【问题讨论】:

  • 您能解释一下您的用例吗? java.sql.Date 是基于 Date 类的糟糕实现,并且在任何情况下,每个 DBMS 对 Date 的含义和范围都有自己的定义。那么为什么需要这些值呢?
  • 这是为了研究一些客户。 admin-user 可以选择创建用户的最大和最小日期。但他不必这样做。所以在他不选择的情况下,我必须在我的 sql 请求中输入最小和最大日期。
  • 那么,当管理员不限制日期时,您为什么不构建一个不同的查询呢?
  • @Kvasir 用户帐户的最短创建日期将是您首次启动系统的时间。最大值将是当前时刻。

标签: java sql date


【解决方案1】:

数据库特定

答案是特定于数据库的,在 Java 或 JDBCjava.sql types 中找不到。数据库之间可能的日期时间值的限制差异很大

例如:

  • Postgres 9.5 TIMESTAMP WITH TIME ZONE 的范围是公元前 4713 年到公元 294276 年。
  • MySQL 5.7 TIMESTAMP 类型的范围为 '1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999' UTC。 DATETIME 值的范围是“1000-01-01 00:00:00.000000”到“9999-12-31 23:59:59.999999”,
  • SQLite has no data types 这样,并将日期时间值存储为 ISO 8601 字符串(“YYYY-MM-DD HH:MM:SS.SSS”)。所以大概仅限于年份9999,如果它一年只跟踪 4 位数字(我不知道)。
  • Firebird seems to have a TIMESTAMP 从 1753 年 1 月 1 日到 9999 年 12 月 31 日,精度为百分之三秒,即 3.33 毫秒。我找不到他们的主要参考页面,也找不到刚刚宣布的第 3 版更新。
  • Microsoft SQL Server datetime2 类型的范围为 0001-01-01 到 9999-12-31 到 CE 1 月 1,1 日到 9999 年 12 月 31 日,时间从 00:00:00 到 23:59:59.9999999(注意 7 位数字分数,比微秒更精细,但比纳秒更粗糙)。还具有 1753 年 1 月 1 日至 9999 年 12 月 31 日的 datetime with range,以及一天中 00:00:00 至 23:59:59.997 的时间。

我建议你选择未来和过去的任意点,而不是确定绝对极限,并将它们作为你的极限。远远超出软件和应用程序生命周期中所遇到的价值,但不会超出大多数数据库的限制。将限制硬编码为应用程序中的常量,例如 Java 中的枚举。

Stack Overflow 上的其他帖子表明,对于查找日期时间值以用作未知或尚未确定值的占位符(我认为这是问题)。

【讨论】:

  • 不知道MYSQL中的TIMESTAMP是否限制为2038-01-19为什么会被发现?
  • @devloper152 我不明白你的评论。
  • 我的意思是在 MySQL 数据库时间戳范围内,正如你所说 MySQL 5.7 TIMESTAMP 类型的范围为 '1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999 ' 所以结束是 2038 年,我们为什么要使用它?
  • @devloper152 在 MySQL 中 TIMESTAMP 的优点是这些值基于与 UTC 偏移的上下文。该偏移量为零时分秒,通常称为“UTC”。至于 2038 的限制,如果这还不够,我建议切换到具有更强大的日期时间功能集的数据库系统,例如 Postgres
  • @devloper152 如果您正在跟踪时刻,时间线上的实际点,您必须存储在具有时区或偏移上下文的类型的列中。否则,您将存储日期和时间,而不知道在哪里,因此也不知道何时。搜索 Stack Overflow 以了解更多信息,因为这已经讨论过很多次了。
【解决方案2】:

如果你对java.util.Date做代码,你会得到

dateModificationMin = Sun Dec 02 17:47:04 CET 292269055
dateModificationMax = Sun Aug 17 08:12:55 CET 292278994

我猜,负长时间戳的日期是错误的,所以最小日期是

new Date(0)==  Thu Jan 01 01:00:00 CET 1970

由于java.sql.date扩展了java.util.Date,所以问题应该是一样的

        long timestamp = -10;

    for (int i = 0; i < 20; i++) {

        System.out.println("timestamp = " + timestamp + " date = " + (new Date(timestamp)));
        timestamp*=10;
    }

你得到:

timestamp = -10 date = Thu Jan 01 00:59:59 CET 1970
timestamp = -100 date = Thu Jan 01 00:59:59 CET 1970
timestamp = -1000 date = Thu Jan 01 00:59:59 CET 1970
timestamp = -10000 date = Thu Jan 01 00:59:50 CET 1970
timestamp = -100000 date = Thu Jan 01 00:58:20 CET 1970
timestamp = -1000000 date = Thu Jan 01 00:43:20 CET 1970
timestamp = -10000000 date = Wed Dec 31 22:13:20 CET 1969
timestamp = -100000000 date = Tue Dec 30 21:13:20 CET 1969
timestamp = -1000000000 date = Sat Dec 20 11:13:20 CET 1969
timestamp = -10000000000 date = Sun Sep 07 07:13:20 CET 1969
timestamp = -100000000000 date = Mon Oct 31 15:13:20 CET 1966
timestamp = -1000000000000 date = Sun Apr 24 23:13:20 CET 1938
timestamp = -10000000000000 date = Mon Feb 10 07:13:20 CET 1653
timestamp = -100000000000000 date = Thu Feb 26 15:13:20 CET 1200
timestamp = -1000000000000000 date = Tue Nov 16 23:13:20 CET 29720
timestamp = -10000000000000000 date = Sun Feb 01 07:13:20 CET 314912
timestamp = -100000000000000000 date = Mon Mar 08 15:13:20 CET 3166840
timestamp = -1000000000000000000 date = Sun Feb 24 23:13:20 CET 31686119

看看日期在 -1 * 10^15 之后如何变得疯狂 也与 java.sql.Date :

timestamp = -10000000000000 date = 1653-02-10
timestamp = -100000000000000 date = 1200-02-26
timestamp = -1000000000000000 date = 720-11-16
timestamp = -10000000000000000 date = 912-02-01
timestamp = -100000000000000000 date = 840-03-08
timestamp = -1000000000000000000 date = 119-02-24
timestamp = 8446744073709551616 date = 634-03-09
timestamp = -7766279631452241920 date = 582-01-06

这里错了!! :D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2012-07-16
    • 2020-02-12
    相关资源
    最近更新 更多