将提取的日期从excel转换为SQL日期
本文关键字:日期 转换 SQL excel 提取 | 更新日期: 2023-09-27 18:09:02
我正在使用c#中的互操作从Excel电子表格中提取数据,我有一个小问题,我想不出答案。
当我使用以下代码提取日期单元格的数据:
string _date = xlWorksheet.get_Range("B3", "B3").Value2.ToString().Trim();
我得到一个值40694,它不会直接进入SQL使用我的插入语句。
我也试过了:
DateTime _date = Convert.ToDateTime(xlWorksheet.get_Range("B3", "B3").Value2.ToString().Trim());
但是返回一个错误说它不能转换
有谁能告诉我怎么做吗?Excel的内部日期值是"days since the epoch",这取决于它是在PC还是Mac模式下(PC版本使用1/1/1900,Mac版本使用1/1/1904),然后有一个额外的设置来与Lotus 1-2-3兼容,这有一些闰年问题。要可靠地转换此数字,需要检查电子表格是基于Windows还是mac的,以及1-2-3 compat标志是否打开。
最好让Excel将字符串格式化为明确的字符串(如1-jan-1904),然后在SQL server中解析回datetime值,而不是试图复制Excel复杂的日期处理逻辑。
使用DateTime.FromOADate()
用你的例子:DateTime _date = DateTime.FromOADate(Double.Parse(xlWorksheet.get_Range("B3", "B3").Value2))
使用DateTime。FromOADate(双d):
DateTime.FromOADate((double)(xlWorksheet.get_Range("B3", "B3").Value2))
遇到了同样的事情,这里是转换
/// <summary>
/// Seriously? For the loss
/// <see cref="http://www.debugging.com/bug/19252"></see>
/// </summary>
/// <param name="excelDate">Number of days since 1900-01-01</param>
/// <returns>The converted days to date</returns>
public static DateTime ConvertXlsdtToDateTime(int excelDate)
{
DateTime dt = new DateTime(1899, 12, 31);
// adjust for 29 Feb 1900 which Excel considers a valid date
if (excelDate >= 60)
{
excelDate--;
}
return dt.AddDays(excelDate);
}
Excel将日期存储为浮点数,计算从1900-01-01 (Mac为1904-01-01)之前的一天起的天数。如果日期在1900-03-01之前,还需要考虑闰年问题。
下面的代码将进行转换:DateTime ConvertToDateTime(Double date) {
if (date < 1)
throw new ArgumentException("Excel dates cannot be smaller than 1.");
var epoch = new DateTime(1900, 1, 1);
if (date > 60D)
date -= 2;
else
date -= 1;
return epoch.AddDays(date);
}