8

我有一个 Sqlite 数据库,用作我的 Quartz.net 调度程序作业的 ado.net 作业存储。在一个表中,名为 START_TIME 的列是 big int 类型。

有没有办法将 bigint 转换为日期值?我希望能够查询数据库以查看在什么日期/时间安排了哪些作业,并且诸如 633869892000000000 之类的值没有意义。

谢谢!

4

5 回答 5

14

这似乎对我有用;从 YourTable 中选择日期时间(DateColumn/10000000 - 62135596800,'unixepoch')

学分; https://forums.xamarin.com/discussion/54282/sqlite-datetime-convert-to-net-datetime

于 2017-01-12T07:10:24.523 回答
10

假设这START_TIME是标准的 seconds-since-Unix-epoch,您可以使用:

select datetime(MyBigIntColumn, 'unixepoch');

请参阅http://www.sqlite.org/lang_datefunc.html,“修饰符”部分。

于 2009-08-27T17:20:54.833 回答
2

从普通时代 (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'

于 2013-11-26T22:27:49.463 回答
1

此日期时间存储为刻度。以下链接涵盖了有关刻度的更多详细信息。

DateTime.Ticks 属性

要将 Ticks 转换为日期时间,您可以使用 SQL 查询作为

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

刻度可以转换为日期时间,如下所示。

DateTime dt = new DateTime(633869892000000000); //output: 2009-08-27​T17:00:00
于 2019-09-30T22:58:30.020 回答
0

这个解决方案只给我一列空值:

从 logging_event 中选择 datetime(timestmp, 'unixepoch')

于 2019-10-29T13:32:55.357 回答