You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 02:52:18