2016-05-10 32 views
1

的最大值和最小值日我看到到處都是,對獲得的最小和最大的日期我必須使用:獲取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

回答

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日期怎麼走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

3

數據庫特有

答案是數據庫特定的,而不是在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上的其他貼子顯示,對於這個尋找日期時間值的問題,沒有簡單的答案來用作未知或尚未確定值的佔位符(我認爲這是背後的目的問題)。