如何在PowerShell中更新日期变量的年份
解决PowerShell日期变量年份修改及SQL Server导入的三个问题
一、修改PowerShell日期变量的年份
PowerShell中的DateTime对象属于不可变类型,无法直接修改其Year属性(提示只读是正常特性)。要将无效年份(如1058、1059)统一替换为1900,需通过构造新的DateTime实例实现:
# 假设$originalDate是从CSV读取的无效日期对象 $fixedDate = [DateTime]::new( 1900, $originalDate.Month, $originalDate.Day, $originalDate.Hour, $originalDate.Minute, $originalDate.Second )
该方法保留原日期的月、日、时分秒信息,仅替换年份为1900,适用于所有无效年份的批量修正。
二、SQL Server导入的三个问题解决
1. 替换Linux风格LF换行符为CRLF
对CSV中的字符串字段执行换行符替换,确保符合SQL Server的文本格式要求:
# 遍历数据行,处理指定字符串字段 foreach ($row in $csvData) { $row.Description = $row.Description -replace "`n", "`r`n" }
2. 为标识列添加占位列
若SQL Server表包含自增标识列,导入时需保留列位置但不提供具体值,可通过DBNull.Value占位:
# 构造DataTable时为标识列赋值DBNull $dt = New-Object System.Data.DataTable $dt.Columns.Add("ID", [int]) # 假设ID是标识列 $dt.Columns.Add("FixedDate", [DateTime]) # 填充数据行 $newRow = $dt.NewRow() $newRow["ID"] = [DBNull]::Value $newRow["FixedDate"] = $fixedDate $dt.Rows.Add($newRow)
若使用SqlBulkCopy工具,需确保未启用KeepIdentity选项,让SQL Server自动生成标识值。
3. 处理SQL Server不支持的1753年前日期
SQL Server的datetime类型最小支持日期为1753-01-01,需将所有早于该日期的修正值替换为最小有效值:
$minSqlDateTime = [DateTime]::new(1753, 1, 1) if ($fixedDate -lt $minSqlDateTime) { $fixedDate = $minSqlDateTime }
若使用SQL Server 2008及以上版本,也可考虑将表字段类型改为datetime2,其支持的最小日期为0001-01-01,无需额外修正。
内容的提问来源于stack exchange,提问作者Code Novice
相关产品推荐
相关产品推荐

