将数据表中的所有 DateTime 列转换为 SqlDateTime 列

Posted

技术标签:

【中文标题】将数据表中的所有 DateTime 列转换为 SqlDateTime 列【英文标题】:Converting all the DateTime Columns to SqlDateTime Columns in a Datatable 【发布时间】:2011-03-27 05:26:44 【问题描述】:

我想要做的基本上是采取 any generic DataTable 然后 将所有 DateTime 列转换为 SqlDateTime 列。 (即如果日期时间列值 = datetime.MinValue 则将其设置为 SqlDateTime.Null)

我是否可以在不更改原始数据表(即不添加计算列)或不必逐行解析整个数据表的情况下做到这一点?

我想这样做的原因是因为我需要将此 Datatable 提供给 SQLBulkCopy 方法,该方法会将它们一起写入数据库。使用 datetime 字段的问题是它在上传时会抛出错误。

AgentX

【问题讨论】:

【参考方案1】:

嗯,我能想到的最好的就是这个,

我知道它是逐行复制数据表,我相信使用 LINQ 可以更优雅地完成,

其他人有答案吗?

                Dim dtOut As DataTable = dt.Clone()
                For Each c As DataColumn In dtOut.Columns
                    If c.DataType.FullName = GetType(DateTime).FullName Then
                        c.DataType = GetType(SqlTypes.SqlDateTime)
                    End If
                Next

                dtOut.BeginLoadData()
                Dim drtmp As DataRow
                For Each dr As DataRow In dt.Rows
                    drtmp = dtOut.NewRow()
                    For Each dc As DataColumn In dt.Columns
                        If dc.DataType.FullName = GetType(DateTime).FullName Then
                            If dr(dc) = Date.MinValue Then
                                drtmp(dc.ColumnName) = SqlTypes.SqlDateTime.Null
                            Else
                                drtmp(dc.ColumnName) = dr(dc)
                            End If
                        Else
                            drtmp(dc.ColumnName) = dr(dc)
                        End If
                    Next
                    dtOut.Rows.Add(drtmp)
                Next
                dtOut.EndLoadData()

【讨论】:

你错过了dtOut.Rows.Add(drtmp) 吗? 另外,您可能希望删除变量 ij 的定义。【参考方案2】:
public void ChangeDateTimeColumn(DataTable newDataTable)

    for (int i = 0; i < newDataTable.Rows.Count; i++)
    
        for (int j = 0; j < newDataTable.Columns.Count; j++)
        
            DataColumn dc = newDataTable.Columns[j];
            if (dc.DataType == typeof(DateTime))
            
                string name = dc.ColumnName;
                DataRow row = newDataTable.Rows[i];
                if (row[name] != null && row[name].ToString().Trim() != "")
                
                    DateTime value = (DateTime)row[name];
                    if (value < (DateTime)SqlDateTime.MinValue)
                    
                        row[name] = (DateTime)SqlDateTime.MinValue;
                    
                    else if ((DateTime)SqlDateTime.MaxValue < value)
                    
                        row[name] = (DateTime)SqlDateTime.MaxValue;
                    
                
            
        
    
 

【讨论】:

以上是关于将数据表中的所有 DateTime 列转换为 SqlDateTime 列的主要内容,如果未能解决你的问题,请参考以下文章

将 pandas 列转换为 datetime64,包括缺失值

将包含多种字符串日期格式的列转换为 Spark 中的 DateTime

如何使用 linq 将 DATETIME 类型的列转换为字符串

即使没有 datetime 列,也获取“将 varchar 数据类型转换为 datetime 数据类型导致超出范围的值”

如何识别列抛出 System.Data.SqlClient.SqlException? (将 datetime2 数据类型转换为 datetime 数据类型)

将 datetime64[ns, UTC] pandas 列转换为 datetime