将提取的日期从excel转换为SQL日期

问题描述:

我使用C#中的互操作从Excel电子表格提取数据,并且我有一个小问题,我不能想到答案。将提取的日期从excel转换为SQL日期

当我提取使用此代码对日期单元格中的数据:

string _date = xlWorksheet.get_Range("B3", "B3").Value2.ToString().Trim(); 

我得到的40694的值不会用我的插入statemwnt直接进入到SQL。

我也曾尝试:

DateTime _date = Convert.ToDateTime(xlWorksheet.get_Range("B3", "B3").Value2.ToString().Trim()); 

但是,这与一个错误说,它不能将其转换回来。

任何人都可以告诉我如何做到这一点?

+0

你可以张贴在字符串格式的日期? – JNK

+0

你从.Value得到了什么(即不是Value2)?甚至可能是.Text? – Rup

使用DateTime.FromOADate()

使用你的例子: DateTime _date = DateTime.FromOADate(Double.Parse(xlWorksheet.get_Range("B3", "B3").Value2))

+0

投射到两倍将无法正常工作。 – phoog

+0

好抓!我将其更改为Double.Parse() – Keith

+0

我越来越 - 无法将类型'字符串'转换为'双'?我错过了什么? –

Excel的内部日期值是“自纪元以来的天数”,这取决于它是在PC还是Mac模式(PC版本使用1/1/1900,Mac版本使用1/1/1904),然后有一个额外的设置与Lotus 1-2-3存在一些闰年问题的bug兼容。可以可靠地转换此数字要求您检查电子表格是基于Windows还是Mac,以及1-2-3 compat标志是否打开。

将Excel格式化为明确的字符串(如1-jan-1904),然后将其解析为SQL服务器中的日期时间值,而不是试图复制Excel复杂的日期处理逻辑,可能会更好。

+0

自“时代以来的日子” - 从来不知道这一点 - 总是想知道那个随机数字意味着什么。谢谢(你的)信息! –

使用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存储da以浮点数计算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); 
}