SQLite экспорт отметки времени - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть база данных SQLite 3 в MacOS с метками времени (обычно что-то вроде 279020203.539467).

В документации говорится, что даты могут храниться как

REAL - as Julian day numbers, the number of days since noon in Greenwich
       on November 24, 4714 B.C. according to the proleptic Gregorian calendar.
* 1007.* И, похоже, это то, что у меня есть.

Я хочу экспортировать это и импортировать в другие базы данных.

Я предполагаю, что тип метки времени несовместим между ядрами баз данных,поэтому где-то должно произойти какое-то преобразование, и я работаю в предположении, что было бы лучше сделать это при экспорте данных из базы данных SQLite.

Но я не могу понять, как это сделать

Я смотрел на этот ответ , который ссылается на это сообщение на форуме , которое указывает, что в SQLite вы можете сделать что-то вроде

select datetime('40660.9454658044', '+2415018 days', '+12 hours', 'localtime');

(возможно, 2415018 - это количество дней между 24 ноября, 4714 г. до н.э. и какой-то другой магической датой ...)

Однако замена строки метки времени в этом примере на то, что у меня приводит к нулю,Предположительно, потому что «279020203.539467» - это другая отметка времени.Это также на несколько величин больше, чем в примере.

Но как преобразовать это в пригодную для использования дату?Я знаю, что это должно произойти примерно в 2011/2012 годах.

Интерпретация данных как "целое число" (в секундах с 1970-01-01) дает 1978, так что это тоже не правильно.

ОБНОВЛЕНИЕ:Я обнаружил, что

288773834.371606 should be 2010-02-25 07.57
296636121.950064 should be 2010-05-27 08.55

(CET, если это имеет значение).

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018
DATEDIF("2010-02-25 07.57"; "2010-05-27 08.55"; "d")

Это дает 91 день, что составляет 7862400 секунд, почти точно так же, как разница между двумя временными метками (296636121.950064 - 288773834.371606 = 7862287.578458).

На MacOS собственные метки времени - это секунды от2001-01-01 (1 января 2001).И

DATEDIF("2001-01-01 00:00"; "2010-02-25 07.57"; "d")

дает 3342 дня, что составляет 288748800 секунд, около, но не точно отметки времени, но эта разница вызвана

  • DATEDIF, обслуживающей только целые дни
  • CET отключен на один час

Исправляя это, мы получаем около 25000 секунд, чтобы добавить, что почти точно приводит нас к отметке времени на 2010-02-25 07.57.

Таким образом, суть в том, что SQLite на MacOS хранит временные метки как собственные временные метки MacOS, которые являются секундами с начала эпохи MacOS (2001-01-01 00.00).Вероятно, это связано с тем, что приложение, создавшее данные, не использует временные метки SQLite, а использует собственные даты MacOS и сохраняет их в базе данных, как и любые другие данные.

Преобразование этого в другой формат должно быть тривиальным, либо во времяэкспорт, преобразование экспортированного файла или во время импорта.

Возможно, было бы проще преобразовать дату экспорта из исходной базы данных, используя

select ...
    datetime(table.timestamp_field, 'unixepoch', '+31 years')
from ...
0 голосов
/ 11 сентября 2018

Хорошая новость: для преобразования юлианской даты в «обычный» формат даты вы можете использовать datetime(strftime('%J',jtime)). К вашему сведению Вот документ для функций даты и времени sqlite. Но есть плохие новости.

A Калькулятор НАСА вычисляет юлианскую дату 2010-02-25 как 2455246. Он вычисляет гражданскую дату 288773834, так как 2 сентября 785907 г. н.э. sqlite не дает того же результата, используя приведенный выше запись, но она не дает «дату».

Несмотря на то, что числа выглядят как нотация Юлианской даты, они не являются датами в наших жизнях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...