获取java.sql.date的最大和最小日期

时间:2016-05-10 12:07:02

标签: java sql date

我随处可见获得我必须使用的日期的最小值和最大值:

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的最大值和最小值?

2 个答案:

答案 0 :(得分:6)

数据库特异性

答案是特定于数据库的,不能在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'世界标准时间。 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")。因此,如果它仅跟踪年份的4位数(我不知道),可能仅限于9999年。
  • 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日,以及时间00:00:00至23:59:59.997 datetime with range

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

Stack Overflow上的其他帖子表明,对于查找日期时间值以用作未知或尚未确定的值的占位符这一问题,没有简单的简单答案(我假设这是背后的目的)问题)。

答案 1 :(得分: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