将提取的日期从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());
但是,这与一个错误说,它不能将其转换回来。
任何人都可以告诉我如何做到这一点?
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复杂的日期处理逻辑,可能会更好。
自“时代以来的日子” - 从来不知道这一点 - 总是想知道那个随机数字意味着什么。谢谢(你的)信息! –
使用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);
}
你可以张贴在字符串格式的日期? – JNK
你从.Value得到了什么(即不是Value2)?甚至可能是.Text? – Rup