Тебе должно быть все равно
Сохраняет ли MySQL TIMESTAMP как метку времени Unix в секундах, например, 1541645714
Или он действительно хранится в формате ISO 8601 2018-11-08T02: 55: 14 + 00: 00
Тебе все равно. Внутреннее представление - это деталь реализации, не связанная с вашей работой. И эта реализация может измениться в будущих версиях.
То, что база данных принимает для входных данных или генерирует для выходных данных, напрямую не связано с ее внутренним представлением.
Все, что вам нужно, это документированное поведение , стандарт SQL и различие между ними.
В случае типов даты и времени стандарт SQL едва касается предмета, определяя несколько типов и определяя очень небольшое поведение. Таким образом, возможности баз данных варьируются широко .
Выдержки из документации MySQL:
Тип данных TIMESTAMP используется для значений, которые содержат как дату, так и время. У TIMESTAMP есть диапазон от «1970-01-01 00:00:01» UTC до «2038-01-19 03:14:07» UTC.
MySQL преобразует значения TIMESTAMP из текущего часового пояса в UTC для хранения и обратно из UTC в текущий часовой пояс для извлечения.
доля доли секунды с точностью до микросекунд (6 цифр)… отбрасывается
Y2038 Проблема
Если вам интересно узнать о реализации, посмотрите на исходный код.
Но даже не глядя на источник, после прочтения этой документации у нас есть две подсказки о типе TIMESTAMP
:
- Любая дробная секунда упала.
- Верхний предел 2038-01-19T03: 14: 07Z.
Итак, мы знаем, что тип, вероятно, сохраняется как 32-битное число целых секунд с даты начала эпохи , обычно используемой в Unix и некоторых других системах: первый момент 1970 года в UTC, 1970- 01-01T00: 00Z. Такое 32-битное число достигнет своего максимума в эту дату, что явление известно в отрасли как Y2038 Проблема .
Если обработка даты и времени важна для вашего проекта, вы можете рассмотреть возможность использования базы данных с более надежной обработкой даты и времени, такой как Postgres .
Умные объекты, а не тупые нити
Вы должны использовать типы даты и времени на вашем языке программирования для обмена значениями даты и времени с вашей базой данных. Избегайте общения с простыми строками.
Лидером в этом отношении является инфраструктура java.time в Java 8 и более поздних версиях с резервным портом, доступным для Java 6 и 7.
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;
Strin sql = "SELECT * FROM event_ WHERE when_ >= ? ;" ;
…
myPreparedStatement.setObject( 1 , odt ) ;
индексирование.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ; // In Postgres and some other databases, the offset-from-UTC will be zero, for UTC itself.
ZonedDateTime zdt = odt.atZoneSameInstant( ZoneId.of( "America/Montreal" ) ) ; // Adjust from UTC into a time zone. Same moment, same point on the timeline, different wall-clock time.
И подтверждая мою точку зрения ... Амадан о другой ответ указывает на то, что представленная выше документация устарела, начиная с MySQL 5.5. Реализация претерпела радикальные изменения в Версии 8.