我有一个 Sqlite 数据库,用作我的 Quartz.net 调度程序作业的 ado.net 作业存储。在一个表中,名为 START_TIME 的列是 big int 类型。
有没有办法将 bigint 转换为日期值?我希望能够查询数据库以查看在什么日期/时间安排了哪些作业,并且诸如 633869892000000000 之类的值没有意义。
谢谢!
这似乎对我有用;从 YourTable 中选择日期时间(DateColumn/10000000 - 62135596800,'unixepoch')
学分; https://forums.xamarin.com/discussion/54282/sqlite-datetime-convert-to-net-datetime
假设这START_TIME
是标准的 seconds-since-Unix-epoch,您可以使用:
select datetime(MyBigIntColumn, 'unixepoch');
请参阅http://www.sqlite.org/lang_datefunc.html,“修饰符”部分。
从普通时代 (CA) 或圣诞节开始,需要数百纳秒(1 ns = 1/10^9 秒)。要将日期从这种格式转换为正常日期:
1. 首先,您需要通过公式将 633869892000000000=YourDateHundredsOfNanoSecondsCA of 100'nanoseconds 转换为 Unixepoch 格式(自 1970 年 1 月 1 日到您的日期的秒数):
(YourDateHundredsOfNanoSecondsCA-(ROUND(1969*(365+1/4-1/100+1/400),0)-2)*24*60*60*1E9/100)*100/1E9,
在哪里:
1.1 ROUND(1969*(365+1/4-1/100+1/400),0)-2)=DaysOf1970Years - 从耶稣出生到 1970 年 1 月 1 日的天数。
1.2 HundredsOfNanoSecondsOf1970Years=DaysOf1970Years*24*60*60*1E9/100 - 从普通时代开始到 Unix 纪元开始(1970 年 1 月 1 日)的数百纳秒。
1.3 YourDateInUnixEpochSeconds=(YourDateHundredsOfNanoSecondsCA-HundredsOfNanoSecondsOf1970Years)*100/1E9 - 从 01/01/1970 到您的日期的秒数。
2.通过函数将Unix Epoch格式日期转换为可读格式(我以SQLite为例):
选择日期时间(YourDateInUnixEpochSeconds,'unixepoch');
对于您的示例,您可以将此字符串复制到 SQLiteStudio 中的 SQL 查询编辑器并运行:
选择日期时间((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'
此日期时间存储为刻度。以下链接涵盖了有关刻度的更多详细信息。
要将 Ticks 转换为日期时间,您可以使用 SQL 查询作为
select datetime(START_TIME/10000000 - 62135596800, 'unixepoch')
--output 2009-08-27 17:00:00
刻度可以转换为日期时间,如下所示。
DateTime dt = new DateTime(633869892000000000); //output: 2009-08-27T17:00:00
这个解决方案只给我一列空值:
从 logging_event 中选择 datetime(timestmp, 'unixepoch')