将提取的日期从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转换为SQL日期

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