C# 将excel中提取的日期转换为SQL日期
我正在使用C#中的interop从Excel电子表格中提取数据,我有一个小问题,我想不出答案 当我使用以下代码提取日期单元格的数据时:C# 将excel中提取的日期转换为SQL日期,c#,sql,.net,excel,C#,Sql,.net,Excel,我正在使用C#中的interop从Excel电子表格中提取数据,我有一个小问题,我想不出答案 当我使用以下代码提取日期单元格的数据时: string _date = xlWorksheet.get_Range("B3", "B3").Value2.ToString().Trim(); 我得到一个40694的值,它不会使用insert statemwnt直接进入SQL 我也尝试过: DateTime _date = Convert.ToDateTime(xlWorksheet.get_Range
string _date = xlWorksheet.get_Range("B3", "B3").Value2.ToString().Trim();
我得到一个40694的值,它不会使用insert 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兼容,后者有一些闰年问题。转换此数字确实需要检查电子表格是否基于Windows或Mac,以及1-2-3 compat标志是否启用
您最好让Excel将字符串格式化为明确的字符串(如1904年1月1日),然后在SQL server中将其解析回datetime值,而不是尝试复制Excel复杂的日期处理逻辑。使用
datetime.FromOADate()
以您的例子:
DateTime\u date=DateTime.FromOADate(Double.Parse(xlsheet.get\u Range(“B3”、“B3”).Value2))
使用DateTime.FromOADate(Double d):
遇到同样的事情,这是转换
/// <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);
}
//
///真的吗?弥补损失
///
///
///自1900-01-01以来的天数
///到目前为止已转换的天数
公共静态日期时间转换器XLSDTTODATETIME(int excelDate)
{
DateTime dt=新的日期时间(1899,12,31);
//调整为1900年2月29日,Excel将其视为有效日期
如果(Excel日期>=60)
{
excelDate--;
}
返回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);
}
DateTime ConvertToDateTime(双日期){
如果(日期<1)
抛出新ArgumentException(“Excel日期不能小于1”);
var epoch=新日期时间(1900,1,1);
如果(日期>60天)
日期-=2;
其他的
日期-=1;
返回历元。添加天数(日期);
}
您能以字符串格式发布日期吗?您从.Value(即非Value2)中获得了什么?甚至可能。发短信?接得好!我将其更改为Double.Parse(),我正在获取-无法将类型“string”转换为“Double”?我错过了什么吗?现在试试,我必须修复类型转换。但是为什么你首先要将它转换为字符串?Value2属性将返回一个装箱双精度,因此只需将其转换为。Bingo-将标记为答案。请告诉我你的代码在做什么?例如,FromOADate是什么?为什么替补上场?“从大纪元开始的日子”-从不知道-总是想知道那个随机数字是什么意思。谢谢你的信息!
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);
}