2009-08-27 3 views
4

У меня есть база данных Sqlite, которую я использую в качестве хранилища заданий ado.net для заданий планировщика Quartz.net. В одной таблице столбец START_TIME имеет тип большой int.Convert Sqlite BigInt to Date

Есть ли способ отличить или преобразовать значение bigint в значение даты? Я хотел бы иметь возможность запросить базу данных, чтобы увидеть, какие задания запланированы в какой день/время, и значение, такое как 633869892000000000, не имеет смысла.

Спасибо!

ответ

6

START_TIME Предполагая, что является стандартным секунд-так-Unix-эпохи, вы можете использовать:

select datetime(MyBigIntColumn, 'unixepoch'); 

См http://www.sqlite.org/lang_datefunc.html, раздел "Модификаторы".

2

Это сотни наносекунд (1 нс = 1/10^9 секунд) с самого начала общего века (Калифорния) или Рождества. Для преобразования даты из этого формата в обычной даты:

1. Сначала вам нужно преобразовать 633869892000000000 = YourDateHundredsOfNanoSecondsCA из 100'nanoseconds в формате Unixepoch (в секундах с 1 января 1970 года до вашей даты) по формуле:

(*) * 24 * 60 * 60 * 1E9/100) * 100/1E9,

, где: (*) * (365 + 1/4-1/100 + 1/400), 0) :

1.1 ROUND (1969 * (365 + 1/4-1/100 + 1/400), 0) -2) = DaysOf1970Years - круглое количество дней от Jeasus, родившихся до 1 января 1970 года.

1.2 HundredsOfNanoSecondsOf1970Years = DaysOf1970Years * 24 * 60 * 60 * 1E9/100 - сотни наносекунд от начала общего века до начала эпохи Unix (1 января 1970 года).

1.3 YourDateInUnixEpochSeconds = (YourDateHundredsOfNanoSecondsCA-HundredsOfNanoSecondsOf1970Years) * 100/1E9 - количество секунд с 01.01.1970 до вашей даты.

2. Преобразовать Unix Epoch формат даты для чтения формат с помощью функции (я дам пример для SQLite):

ВЫБОР DateTime (YourDateInUnixEpochSeconds, 'unixepoch');

Для примера вы можете скопировать эту строку в редакторе SQL запросов в SQLiteStudio и запустить:

ВЫБРАТЬ даты и времени ((633869892000000000- (ROUND (1969 * (365 + 1/4-1/100 + 1/400), 0) -2) * 24 * 60 * 60 * 1E9/100) * 100/1E9, 'unixepoch');

и в результате вы получите «2010-12-19 17:00:00»

+0

Для меня это утверждение - SELECT datetime ((DateColumn- (ROUND (1969 * (365 + 1/4-1/100 + 1/400), 0) -2) * 24 * 60 * 60 * 1E9/100) * 100/1E9, 'unixepoch') от YourTable; - построил даты на год вперед. Но это второе высказывание, предложенное @Gizboy, похоже, отлично работает (и это также немного более чисто) - выберите datetime (DateColumn/10000000 - 62135596800, 'unixepoch') из YourTable; Спасибо вам обоим в любом случае! – leoneboaventura