Sql server 在Powershell中调用sqlcmd时,如何指定区域/语言/区域性设置?
在SQLServerManagementStudio中执行返回日期时间的函数(如Sql server 在Powershell中调用sqlcmd时,如何指定区域/语言/区域性设置?,sql-server,powershell,datetime,invoke-sqlcmd,Sql Server,Powershell,Datetime,Invoke Sqlcmd,在SQLServerManagementStudio中执行返回日期时间的函数(如GETDATE())时,输出将在用户的“区域性”(区域/语言设置)中格式化。 但是,当在Powershell中通过Invoke-Sqlcmdcmdlet执行相同的查询时,输出的格式为US-date格式(我假设为不变区域性)。 其他cmdlet,如Get Date返回当前区域性中的日期时间 如何确保Invoke Sqlcmd的输出符合当前区域性设置 要演示的最小代码示例 $result = Invoke-Sqlcmd
GETDATE()
)时,输出将在用户的“区域性”(区域/语言设置)中格式化。
但是,当在Powershell中通过Invoke-Sqlcmd
cmdlet执行相同的查询时,输出的格式为US-date格式(我假设为不变区域性)。
其他cmdlet,如Get Date
返回当前区域性中的日期时间
如何确保Invoke Sqlcmd
的输出符合当前区域性设置
要演示的最小代码示例
$result = Invoke-Sqlcmd -query "select GETDATE() as datetime" -ServerInstance ...
$now = Get-date -format "yyyy-MM-dd HH:mm:ss"
if ( $result.datetime -eq $now) {
Write-output "ok"
} else {
Write-warning "dates mismatch '$($result.datetime)' should be '$now'"
}
警告显示以US格式显示的第一个datetime,以及以指定格式显示的第二个datetime
$result。datetime
的类型为datetime
,而$now
的类型为string
。这就是为什么您的比较和输出不能按预期工作的原因。您可以不将当前日期转换为字符串:
。。。
$now=获取日期
如果($result.datetime-eq$now){
...
但请记住,然后将使用毫秒的精度比较这两个值。根据格式字符串,我假设您只需要秒的精度。然后可以执行以下操作:
。。。
$now=获取日期
$format='yyyy-MM-dd HH:MM:ss'
if($result.datetime.toString($format)-eq$now.toString($format)){
...
您应该对脚本执行ifx操作,以便在使用日期或数字时不使用特定于语言环境的文字。GetDate()
没有格式-它只是一个强类型的二进制日期时间值。您是否正在将其转换为字符串?如果使用INSERT-INTO-MyTable(mycl)值(GetDate()),请发布脚本
locale不重要。如果您改为编写EXEC'INSERT…'+GETDATE()+'..'
您有一个bug。如果区域设置发生更改,脚本将失败,并且容易受到许多其他问题的攻击,包括SQLinjection@PanagiotisKanavos:我不是用它来插入。脚本的目的是验证自定义函数是否正确返回当前日期时间。您完全正确地认为该函数(如GETDATE()
)返回System.DateTime对象。格式化发生在写入警告调用中,该调用显示结果和预期值(作为字符串传递给函数)。如果您将第一条注释作为答案发布,我将接受。谢谢@Thomas。我将尽快测试(这可能需要一段时间,现在正在处理一些其他优先事项)并将接受您的答案或提供反馈!