【发布时间】:2011-02-15 17:51:05
【问题描述】:
如何让 SQLite 将 excel 类型的序列号转换为日期,例如我希望表格中的整数 40074 以某种方式获得 2009 年 9 月 18 日的日期?
日期已经在 SQLite 中了。
【问题讨论】:
标签: excel datetime date sqlite
如何让 SQLite 将 excel 类型的序列号转换为日期,例如我希望表格中的整数 40074 以某种方式获得 2009 年 9 月 18 日的日期?
日期已经在 SQLite 中了。
【问题讨论】:
标签: excel datetime date sqlite
sqlite> SELECT DATE('1899-12-30', '+40074 days');
2009-09-18
【讨论】:
这似乎有效:
sqlite> SELECT DATETIME((49400 * 3600 * 24) - 3014928000, 'unixepoch');
2009-09-18 00:00:00
老实说,我只是猜测并检查了那里的常数,但我确信有简单的数学可以支持它。
看起来它也适用于比纪元更早的日期,但我还没有彻底测试过。
【讨论】:
要处理 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
【讨论】:
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 年是闰年)
【讨论】:
感谢@Aman_Srivastava,效果很好
alter mytable add fixed_date DATE;
update mytable set fixed_date = DATE(( excel_date - 25569) * 86400 , 'unixepoch') where excel_date is not null;
【讨论】: