获取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的最大值和最小值?
答
如果你的代码与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或JDBC或java.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上的其他贴子显示,对于这个寻找日期时间值的问题,没有简单的答案来用作未知或尚未确定值的占位符(我认为这是背后的目的问题)。
你能解释你的用例吗? 'java.sql.Date'是基于'Date'类的糟糕的实现,无论如何,每个DBMS都有自己的'Date'意味着什么以及它的范围是什么的定义。那么为什么你需要这些值? – RealSkeptic
这是研究一些客户。管理员用户可以选择用户创建的最大和最小日期。但他不必这样做。所以在他不选择的情况下,我必须在我的sql请求中放置最小和最大日期。 – Kvasir
那么,为什么你不建立一个不同的查询,当管理员不限制日期? – RealSkeptic