Excel / SQLite日期序列号

时间:2010-05-05 02:00:55

标签: excel datetime date sqlite

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

日期已经在SQLite中。

4 个答案:

答案 0 :(得分:2)

这似乎有效:

sqlite> SELECT DATETIME((49400 * 3600 * 24) - 3014928000, 'unixepoch');
2009-09-18 00:00:00

老实说,我只是猜测并检查了那里的常数,但我确信有简单的数学来支持它。

它似乎适用于早于纪元的日期,但我没有彻底测试过。

答案 1 :(得分:1)

sqlite> SELECT DATE('1899-12-30', '+40074 days');
2009-09-18

答案 2 :(得分:0)

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

-- 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

答案 3 :(得分:-1)

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);

(如果你想知道为什么这个时代是30/12/1899,那是因为实际时代应该是1/1/1900但是Excel错误地认为1900年是闰年)