Excel/SQLite日期序列号

Excel/SQLite日期序列号,excel,datetime,date,sqlite,Excel,Datetime,Date,Sqlite,如何让SQLite将excel类型的序列号转换为日期,例如,我希望表格中的整数40074以某种方式获得日期2009年9月18日 日期已经存在于SQLite中。Excel将日期存储为自1899年12月30日起的天数,因此要将数字转换为日期或从日期转换为日期,只需计算1899年12月30日至之后日期之间的天数。你如何做到这一点取决于你所使用的语言,但对于C语言来说,以下方法是可行的: var epoch = new DateTime(1899, 12, 30); int number = 4007

如何让SQLite将excel类型的序列号转换为日期,例如,我希望表格中的整数40074以某种方式获得日期2009年9月18日


日期已经存在于SQLite中。

Excel将日期存储为自1899年12月30日起的天数,因此要将数字转换为日期或从日期转换为日期,只需计算1899年12月30日至之后日期之间的天数。你如何做到这一点取决于你所使用的语言,但对于C语言来说,以下方法是可行的:

var epoch = new DateTime(1899, 12, 30);

int number = 40074;
var date = epoch.AddDays(number);
Console.WriteLine(date);

var date = new DateTime(1987, 5, 3);
int number = (int) date.Subtract(epoch).TotalDays;
Console.WriteLine(number);
(如果你想知道为什么纪元是1899年12月30日,那是因为实际纪元应该是1900年1月1日,但Excel错误地认为1900年是闰年)

这似乎可行:

sqlite> SELECT DATETIME((49400 * 3600 * 24) - 3014928000, 'unixepoch');
2009-09-18 00:00:00
老实说,我只是猜测并检查了那里的常数,但我肯定有简单的数学来支持它


它似乎也适用于早于纪元的日期,但我尚未对其进行彻底测试。

要处理excel日期值并在sqlite3中返回人类可读的日期,请考虑:

sqlite> SELECT DATE('1899-12-30', '+40074 days');
2009-09-18
-- unix epoch is 00:00:00 UTC on 1 January 1970 (1970/01/01)

-- 86400 = Seconds in a day

-- 25569 = Days between 1970/01/01 and 1900/01/01 (min date in Windows Excel)
公式,或者说陈述:

SELECT DATETIME(( EXCEL_DATE - 25569) * 86400 , 'unixepoch') AS UNIX_DATE;
根据初始问题中提供的excel日期完成的示例:

sqlite> SELECT DATETIME(( 40074 - 25569) * 86400 , 'unixepoch') AS UNIX_DATE;

2009-09-18 00:00:00

抱歉,我特别询问了在SQLite工作的情况。我理解系统或使用其他语言(python是我最喜欢的语言)没有问题;只是语法不同,实际上是Lotus123使用了1900年1月1日作为纪元,而错误地认为1900年是闰年。对于Excel(VBScript),他们通过将纪元日期放回来纠正这一点。对于1900年2月29日之后的所有日期,Excel和Lotus 123都同意,对于不同日期之前的日期(但Excel实际上就在那里)。