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

PowerShell调用Invoke-Sqlcmd日期转换失败,求SQL表更新方案

解决PowerShell更新SQL日期时间字段的转换错误问题

你遇到的Conversion failed when converting date and/or time from character string错误,根源有两个:一是手动拼接的日期字符串格式不被SQL Server识别,二是直接将变量嵌入SQL语句的做法既不安全(存在SQL注入风险)也不可靠。下面给你几种靠谱的解决办法:

方法1:使用参数化查询(强烈推荐)

参数化查询是处理SQL变量的最佳实践,它能自动处理类型转换,还能避免SQL注入。修改你的Invoke-Sqlcmd部分如下:

# 不需要手动格式化日期,直接用原始的DateTime对象
$finaldate = $c.LastWriteTime

Invoke-Sqlcmd -ServerInstance "Server" -Database "db" -Query @"
UPDATE [server].[schema].[table] 
SET [columnName] = @DateTimeValue
"@ -Parameter @{ DateTimeValue = $finaldate }

这里直接把.NET DateTime类型的变量传给SQL参数,SQL Server会自动正确解析,完全不需要你手动拼接字符串。

方法2:直接使用ISO8601格式的字符串(如果必须用字符串)

如果你坚持要通过字符串传递日期,一定要用SQL Server能稳定识别的ISO8601格式(yyyy-MM-ddTHH:mm:ss.fffffff),修改你的日期格式化逻辑:

# 直接用Get-Date的标准格式输出,不用手动拼接
$finaldate = Get-Date -Date $date -Format "yyyy-MM-ddTHH:mm:ss.fffffff"

Invoke-Sqlcmd -ServerInstance "Server" -Database "db" -Query "UPDATE [server].[schema].[table] SET [columnName] = '$finaldate'"

不过还是建议优先用参数化查询,因为字符串拼接始终存在SQL注入风险。

额外优化:简化日期获取代码

其实你获取目标文件最后修改时间的代码可以大幅简化,不需要绕圈添加NoteProperty:

$location = 'path'
Set-Location $location
# 直接获取最后修改的文件的LastWriteTime属性
$finaldate = Get-ChildItem 'path' | Sort-Object LastWriteTime | Select-Object -Last 1 -ExpandProperty LastWriteTime

这样代码更简洁,也减少了出错的可能性。

内容的提问来源于stack exchange,提问作者JM1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:27:55