SQL中不接受PowerShell日期格式

iyr7buue  于 2023-02-19  发布在  Shell
关注(0)|答案(3)|浏览(153)

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

dy1byipe

dy1byipe1#

对于将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.右键单击服务器示例并选择Properties > Advanced
1.将Default language更改为Dutch(或您使用的内容)
1.使用Ok确认
1.仍在SQL Management Studio中,转到Security > Logins(数据库下方)
1.双击您的user name并选择下面的Dutch作为Default language
1.重新启动SQL Management Studio,您应该可以开始了

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

3lxsmp7m

3lxsmp7m2#

我在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
6mw9ycah

6mw9ycah3#

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

相关问题