2016-05-10 4 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', и в любом случае каждая СУБД имеет свое собственное определение того, что означает '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 

посмотреть, как даты идут Crasy после -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

3

База данных конкретных

Ответ конкретной базы данных, не следует искать в Java или JDBC или java.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 строки (" ГГГГ-ММ-ДД ЧЧ: ММ: SS.SSS "). Предположительно, он ограничен годом 9999, если он отслеживает только 4 цифры за год (я не знаю).
  • Firebird seems to have a TIMESTAMP с 1 января 1753 года по 31 декабря 9999 года с точностью до трех сотых секунды или 3,33 миллисекунды. Я не смог найти их главную страницу ссылок или обновление только для анонсированной версии 3.
  • Microsoft SQL Server datetime2 тип имеет диапазон от 0001-01-01 до 9999-12-31 до января 1,1 CE до 31 декабря 9999 года н.э., раз с 00:00:00 по 23: 59: 59.9999999 (обратите внимание на 7 цифры фракции, более мелкие, чем микросекунды, но более крупные, чем наносекунды). Также имеет datetime with range от 1 января 1753 года, до 31 декабря 9999 года, и время от 00:00:00 до 23: 59: 59.997.

Вместо определения абсолютного предела я предлагаю вам выбрать произвольные точки в будущем и в прошлом и использовать их в качестве своих пределов. Достаточно далеко, чтобы выходить за рамки ценности, которая должна возникать при жизни вашего программного обеспечения и приложений, но не настолько далеко, чтобы превышать пределы большинства баз данных. Hard-code ограничивает как константы в вашем приложении, как перечисления в Java, например.

Другие публикации, посвященные переполнению стека, показали, что нет чистого простого ответа на этот вопрос о поиске значений даты и времени для использования в качестве заполнителей для неизвестных или еще не определенных значений (которые, как я полагаю, является целью вопрос).

Смежные вопросы