Преобразование Sqlite BigInt в дату

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

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

Спасибо!


person Community    schedule 27.08.2009    source источник


Ответы (5)


Это, казалось, сработало для меня; выберите дату и время (DateColumn/10000000 - 62135596800, 'unixepoch') из YourTable

Кредиты ; https://forums.xamarin.com/discussion/54282/sqlite-datetime-convert-to-net-datetime

person Menzi    schedule 12.01.2017

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

select datetime(MyBigIntColumn, 'unixepoch');

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

person Ian Kemp    schedule 27.08.2009

Это сотни наносекунд (1 нс = 1/10 ^ 9 секунды) от начала Общего Века (CA) или Рождества. Чтобы преобразовать дату из этого формата в обычную дату:

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

(YourDateHundredsOfNanoSecondsCA-(ROUND(1969*(365+1/4-1/100+1/400),0)-2)*24*60*60*1E9/100)*100/1E9,

куда:

1.1 ОКРУГЛ(1969*(365+1/4-1/100+1/400),0)-2)=DaysOf1970Years - округление количества дней от рождения Иисуса до 1 января 1970 года.

1.2 HundredsOfNanoSecondsOf1970Years=DaysOf1970Years*24*60*60*1E9/100 - сотни наносекунд от начала Common Age до начала Unix Epoch (1 января 1970).

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

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

SELECT datetime(YourDateInUnixEpochSeconds, 'unixepoch');

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

SELECT datetime((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'

person Alekzander    schedule 26.11.2013
comment
Для меня это утверждение - 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; Спасибо вам обоим в любом случае! - person leoneboaventura; 28.07.2017

Эта дата и время хранится в виде тиков. Следующая ссылка содержит более подробную информацию о тиках.

Свойство DateTime.Ticks

Чтобы преобразовать тики в дату и время, вы можете использовать SQL-запрос как

select datetime(START_TIME/10000000 - 62135596800, 'unixepoch') 
--output 2009-08-27 17:00:00

Тики могут быть преобразованы в DateTime, как показано ниже в C Sharp.

DateTime dt = new DateTime(633869892000000000); //output: 2009-08-27​T17:00:00
person Shoaib    schedule 30.09.2019

Это решение дает мне только столбец пустых значений:

выберите дату и время (timestmp, 'unixepoch') из logging_event

person Leif Hyrne    schedule 29.10.2019