获取java.sql.date

问题描述:

的最大值和最小值日我看到到处都是,对获得的最小和最大的日期我必须使用:获取java.sql.date

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

但我做我的java.sql。日期是回报: 055-12-02最短日期 994-08-17最大日期

我该怎么办才能获得java.sql.date的最大值和最小值?

+2

你能解释你的用例吗? 'java.sql.Date'是基于'Date'类的糟糕的实现,无论如何,每个DBMS都有自己的'Date'意味着什么以及它的范围是什么的定义。那么为什么你需要这些值? – RealSkeptic

+0

这是研究一些客户。管理员用户可以选择用户创建的最大和最小日期。但他不必这样做。所以在他不选择的情况下,我必须在我的sql请求中放置最小和最大日期。 – Kvasir

+1

那么,为什么你不建立一个不同的查询,当管理员不限制日期? – RealSkeptic

如果你的代码与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日期怎么走crasy:

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

数据库特有

答案是数据库特定的,而不是在Java或JDBCjava.sql types被发现。数据库之间可能的日期时间值限制巨大

例如:

  • Postgres 9.5 TIMESTAMP WITH TIME ZONE具有范围BC 4713的到AD 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“)。所以假设它只追踪年份的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至1月1日至11月9999年12月31日,从00:00:00至23:59:59.9999999(注意7小数部分,比微秒更细,但比纳秒更粗)。也有1753年1月1日的datetime with range,直到9999年12月31日,以及时间00:00:00至23:59:59.997。

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

Stack Overflow上的其他贴子显示,对于这个寻找日期时间值的问题,没有简单的答案来用作未知或尚未确定值的占位符(我认为这是背后的目的问题)。