Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将excel中提取的日期转换为SQL日期_C#_Sql_.net_Excel - Fatal编程技术网

C# 将excel中提取的日期转换为SQL日期

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

我正在使用C#中的interop从Excel电子表格中提取数据,我有一个小问题,我想不出答案

当我使用以下代码提取日期单元格的数据时:

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