Я хотел бы использовать тип данных Long в базе данных для представления дат (как millis с эпохи). Причина, почему, состоит в том, что хранение дат так сложно с jdbc драйвером и механизмом Oracle. При представлении неверного типа данных в preparedStatement, он бросает метку времени на дату (или наоборот) выдувание индекса, приводящего к полным сканированиям таблицы в худшем варианте развития событий. Я не могу помнить детали, но я знаю, что существуют детали для запоминания. Я не хочу должным быть помнить детали. Это походит на просто хранение дат, поскольку долго (millis с эпохи) работал бы здесь очень хорошо, и у меня нет ничего для запоминания.
Отметьте, я чувствую, что часовой пояс просто представляем. Это никогда не должно храниться во-первых. Большинство компаний имеет политику только использования UTC, но еще раз, который является просто большей информацией для знания. Позвольте нам всем просто сохранить количество миллисекунд, так как эпоха, и на дисплей показывает пользователю millis, отформатированный к ИХ зоне определенного времени.
Править: Просто кажется, что миллионы долларов в ошибках и потраченной впустую производительности/беспорядке вращаются вокруг часовых поясов и форматирования даты, наряду с сумасшедшим jdbc преобразованием/кастингом даты драйвера. Давайте покончим с ним раз и навсегда.
Я понимаю теперь, когда другая причина против выполнения, что я предлагаю, состоит в том, что мы можем хотеть оставить свободное место в дб. В этом случае у нас может быть decaseconds или даже просто "секунды" с эпохи. К тому, какой бы ни градус требуется оставить свободное место.
Я могу думать по причине, чтобы сохранить дату и время, предшествующие 1 января 1970 года, 00:00:00 по Гринвичу.
Но я чувствую твою боль. Обработка Oracle date / datetime в JDBC болезненна. Это даже несовместимо между разными версиями драйверов!
Должен сказать, что я не обнаружил особых проблем в других драйверах JDBC (других поставщиков БД), хотя ...
Теперь проблема вообще.
Если вам не нужен какой-либо запрос, содержащий вычисления в столбце даты, в этом случае база данных должна иметь понятный ей тип даты.
Возможно, вам это не нужно, поэтому вы можете использовать любое представление, которое вам нравится.
Вы можете использовать целые числа или другие подходящие типы для представления значений даты/времени в вашей базе данных. Однако это создает пару проблем:
Все ваши текущие и будущие (!!!) приложения (Java или другие), которые используют таблицы базы данных, должны конвертировать между целыми числами базы данных и значениями даты/времени.
Если ваши SQL-запросы, хранимые процедуры SQL или триггеры SQL задействуют соответствующие столбцы, им может потребоваться выполнить преобразование. Это делает их более сложными и трудновыполнимыми. Более того, дополнительная сложность может привести к тому, что механизм запросов вернется к более медленному способу выполнения запроса... потому что оптимизатор запросов не понимает, что вы делаете.
Использование целых чисел для представления дат затруднит выполнение специальных SQL-запросов к таблице с использованием столбцов даты.
EDIT
Экономия места при представлении дат в виде целых чисел зависит от базы данных. IIRC, Oracle хранит значения даты/времени как примитивные целые числа. И я ожидаю, что любая приличная РСУБД будет делать то же самое... как для экономии места, так и для эффективности запросов.
Хранение значений даты/времени в виде целых чисел не решает проблему часовых поясов. Это фундаментально сложная проблема.
Затем возникает вопрос о гранулярности. (Используя синтаксис даты ISO для ясности) означает ли "1999" то же самое, что "1999-01-01" или "1999-01-01T00:00:00"? А как насчет субсекундной точности?
Дело в том, что никакое простое представление даты/времени (или целого числа) в SQL не может справиться со всем этим. Основная причина ошибок/проблем/сложностей, которые мы наблюдаем, заключается в том, что программисты используют короткие пути в своей реализации и (что более важно) небрежны в своем мышлении.
EDIT 2
Есть еще вопрос, что многие проблемы все еще возникают из-за различий в том, как различные базы данных и их соответствующие драйверы JDBC обрабатывают литералы даты и предположения о часовых поясах. Я не эксперт по JDBC и стандарту(ам) SQL, но корневые проблемы, похоже, следующие:
Все это приводит к возникновению проблем переносимости и конфигурации для разработчика Java. Однако я не думаю, что это значительно хуже, чем переносимость и проблем с конфигурацией, которые мы получаем с другими аспектами приложений Java / RDBMS. А полностью отказавшись от типов datetime, вы приобретете кучу других проблем; см. выше.
В чем вопрос? Вы спрашиваете, возможно ли это? Это будет зависеть от того, какую базу данных вы используете, но я предполагаю, что это возможно с большинством. Я определенно сделал это с помощью SQL lite в приложениях для Android (которые запрограммированы на Java, если вы с ним не знакомы).
Единственная проблема неиспользования типа данных date заключается в том, что вам, возможно, придется выполнять преобразования в вашем приложении из значения Long в дату, если вам нужно сделать что-то вроде сравнения дат. Вы можете хранить данные как угодно, но на уровне представления это может стать более проблематичным и потребовать дополнительного кода. Например, заполнение компонентов, таких как календарь.