SQL中不接受PowerShell日期格式

时间:2014-07-31 09:18:07

标签: date datetime powershell environment-variables

我有一个奇怪的问题。当服务器的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张生成内容时,我遇到了同样的问题。它还抱怨日期时间格式。

3 个答案:

答案 0 :(得分:4)

要将DateTime字段等信息导出到SQL,请使用默认语言设置English (United States)

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

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

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

  1. 右键单击服务器实例,然后选择Properties > Advanced
  2. Default language更改为Dutch(或您使用的内容)
  3. 使用Ok
  4. 确认
  5. 仍在SQL Management Studio转到Security > Logins(数据库下方)
  6. 双击user name,然后选择Dutch下面的Default language
  7. 重启SQL Management Studio,你应该好好去
  8. <强>结果: 在PowerShell代码中使用CmdLet Get-Date时,在将数据传输到SQL时,它将按设计工作。 SQL和Windows的系统语言仍然是英语,但使用的格式是荷兰语。

答案 1 :(得分:0)

我在SQL Server中将它用于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

答案 2 :(得分:0)

如果你已经使用过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模块日期时都以正确的方式格式化它们。