繁体   English   中英

PowerShell SQL 不接受日期格式

[英]PowerShell date format not accepted in SQL

我遇到了一个奇怪的问题。 当服务器的Region and Language设置设置为English (United States)时,包含日期和时间的对象没有问题。 但是,当我将其更改为我所在国家/地区的当地Dutch (Belgium)时,我的一些 PowerShell 脚本遇到了问题。

PowerShell 中是否有某个变量需要设置以解决此问题? 还是我必须一直默认服务器上的英文日期格式?

例如,我们使用 Don Jones 提供的SQL module来填充 SQL 数据库。 此行在设置为荷兰语时会生成错误,但在设置为英语时不会:

if ($properties[$property] -eq 'datetime2') { [datetime]$prop = $result.GetDateTime($result.GetOrdinal($property)) }

我检索日期的唯一方法是Get-Date ,没有任何特殊之处。 当设置为Dutch (Belgium)时,它会生成此错误:

Exception calling "ExecuteNonQuery" with "0" argument(s): "Conversion failed when converting date and/or time from char
acter string."

在为Excel表生成内容时,我遇到了同样的问题。 它还抱怨日期时间格式。

对于将DateTime字段等信息导出到 SQL,默认语言设置为English (United States)

因此,当您的Region and Language设置与 SQL 的默认设置不同时,即: English (United States) <> Dutch (Belgium) ,您应该在代码中使用以下格式以符合英语默认设置:

Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
$_.whenCreated.ToString('yyyy-MM-dd HH:mm:ss')

另一种解决方案是更改 SQL Express 2014 中输入的默认语言:

  1. 右键单击服务器实例和 select Properties > Advanced
  2. Default language更改为Dutch (或您使用的语言)
  3. Ok确认
  4. 仍在SQL Management Studio go 到Security > Logins (在 Databases 下方)
  5. 双击您的user name和下面的 select Dutch作为Default language
  6. 重新启动SQL Management Studio ,你应该对 go 好了

结果:当您在 PowerShell 代码中使用 CmdLet Get-Date时,它会在将数据传输到 SQL 时按设计工作。SQL 和 Windows 的系统语言仍然是英语,但使用的格式是荷兰语。

我将它用于 SQL 服务器中的 Datetime2。

Function Get-Datetime2([datetime]$Date = $(Get-Date) ) {
    $DT = Get-Date -Date $Date
    [string]$DateTime2 =  $DT.Month.ToString() + '/'
    [string]$DateTime2 += $DT.Day.ToString() + '/'
    [string]$DateTime2 += $DT.Year.ToString() + ' '
    [string]$DateTime2 += $DT.TimeOfDay.ToString()
    return $DateTime2
}

Get-Datetime2

返回看起来像这样的东西。

3/12/2018 03:04:34.7496659

如果您已经使用过 Don Jones 的模块,您可能已经熟悉通过 *.types.ps1xml 的类型扩展...如果我没记错的话,他的模块中也应该有一个。

添加以下类型声明时,

  <Type>
    <Name>System.DateTime</Name>
    <Members>
      <ScriptMethod>
        <Name>ToString</Name>
        <Script>
          $(Get-Date $This -Format "yyyy-MM-dd HH:mm:ss")
        </Script>
      </ScriptMethod>
    </Members>
  </Type>

您基本上将 System.DateTime 的 ToString() 方法重写为标准 SQL Server 安装所需的格式。

通过这种方式,您可以确保每次加载 SQL 模块日期时,它们的格式都是正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM